Python--读取 dat 文件行,重写 Excel 中的列。 csv/numpy/openpyxl

标签 python excel numpy csv openpyxl

我在使用 csv/numpy/openpyxl 时遇到了一些问题,问题是
我有一个 .dat 文件,在

a,a,a,a
b,b,b,b
c,c,c,c

我想取每一行dat文件,把它放到每个excel的一列中,意思是

excel文件:
a b c
a b c
a b c

这是我到目前为止所做的:
import csv
import openpyxl
import numpy as np


wb = openpyxl.Workbook()
ws = wb.active

with open('Shari10.dat') as f:
    dat_reader = csv.reader(f, delimiter = ",")

    for header in csv.reader(f):
        break

    for dat_line in f:
        line = dat_line.split(",")

        data = np.vstack(line[1:8])

        for row in data:
            ws.append(row)
            print(row)
        #wb.save("coffee.xlsx")

这是错误:
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-17-a07e6ac6842f> in <module>
     20         print(data)
     21         for row in data:
---> 22             ws.append(row)
     23         #wb.save("coffee.xlsx")

~\AppData\Local\Continuum\anaconda3\lib\site-packages\openpyxl\worksheet\worksheet.py in append(self, iterable)
    665 
    666         else:
--> 667             self._invalid_row(iterable)
    668 
    669         self._current_row = row_idx

~\AppData\Local\Continuum\anaconda3\lib\site-packages\openpyxl\worksheet\worksheet.py in _invalid_row(self, iterable)
    792     def _invalid_row(self, iterable):
    793         raise TypeError('Value must be a list, tuple, range or generator, or a dict. Supplied value is {0}'.format(
--> 794             type(iterable))
    795                         )
    796 

TypeError: Value must be a list, tuple, range or generator, or a dict. Supplied value is <class 'str'>

作为引用,我试图这样做:
data = [
         ['A', 100, 1.0],
         ['B', 200, 2.0],
         ['C', 300, 3.0],    
         ['D', 400, 4.0],        
 ]
for row in data:
    ws.append(row)

同时,我刚刚开始学习python,所以请原谅我凌乱的代码结构,至于语法,我正在尝试尽可能准确地编写而不是缩短代码。

最佳答案

看起来您在 numpy 数组不是列表时遇到了一些问题。你可以通过使用 numpy 的 tolist() 来解决这个问题。通过改变这个方法

for row in data:
    ws.append(row)
    print(row)

对此
for row in data:
    ws.append(row.tolist())
    print(row.tolist())

只需更改这些行将使代码成功运行,但它不会提供您想要的输出。使用输入文件运行代码
a,a,a,a
b,b,b,b
c,c,c,c

生成一个看起来像这样的电子表格,因为您将每个行数组转置为一个列数组,然后将各列堆叠在一起(ws.append 将行添加到工作表的底部)
b
b
b
b\n
c
c
c
c\n

如果您希望转置整个 csv(包括标题),一个简单的方法是使用 numpy 的 transpose方法。此方法将为您交换整个数组,然后您可以遍历每一行以将它们中的每一个写入工作表。这将简化您在 csv 文件中的读取方式,如下所示。牢记transpose仅适用于方形数组,因此我添加了一些代码来对任何锯齿状数组进行平方。
import openpyxl
import numpy as np

# Create 
wb = openpyxl.Workbook()
ws = wb.active

with open('input.dat') as f:
    # Read in all the data
    data = list(csv.reader(f))

    ## If your CSV isn't square, you need to square it first
    # Get longest row in array
    longest = len(max(data, key=len))
    # Pad every row to longest row length
    for row in data:
        row.extend( (longest - len(row))*[''])

    ## Once data is square, continue as normal
    # Transpose the array
    data = np.transpose(data)

    # Write all rows to worksheet
    for row in data:
        ws.append(row.tolist())

# Save worksheet
wb.save('test.xlsx')

关于Python--读取 dat 文件行,重写 Excel 中的列。 csv/numpy/openpyxl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60880658/

相关文章:

vba - 将数字字符转换为字母字符

python - 检查高维数组的有效方法在 Python 中的两个 ndarray 中重叠

python - django-reversion 撤消功能 - 恢复多个对象

excel - 具有条件的多张纸的公式

python - PyCharm 和 Pypy - Unresolved reference

vba - Excel VBA - 删除*word*后的字符串内容

python - numpy/matplot : How to plot First X% is in range Y%?

python - 从数组中提取元素时出错。 Python

python - 向量化 Pandas 中的函数

python - 如何使用内置的身份验证机制保护Azure WebApp的安全