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

Nelson Wang |

我在使用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,因此请原谅我凌乱的代码结构,至于语法,我正尝试尽可能准确地编写而不是缩短代码。

NyxHolas

看起来您遇到一些numpy数组不在列表中的问题。您可以tolist()通过更改numpy的方法来解决此问题

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')

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章