【发布时间】:2018-01-02 14:00:00
【问题描述】:
我有一个包含 15,000 多个 csv 文件的文件夹。它们都有不同数量的列名。
大多数文件的第一行作为列名(数据属性),如下所示:
Name Date Contact Email
a b c d
a2 b2 c2 d2
我想要做的是读取所有文件的第一行,将它们存储为列表,然后将该列表写入新的 csv 文件。
这是我到目前为止所做的:
import csv
import glob
list=[]
files=glob.glob('C:/example/*.csv')
for file in files :
f = open(file)
a=[file,f.readline()]
list.append(a)
with open('test.csv', 'w') as testfile:
csv_writer = csv.writer(testfile)
for i in list:
csv_writer.writerow(i)
当我尝试这段代码时,结果如下:
[('C:/example\\example.csv', 'Name,Date,Contact,Email\n'), ('C:/example\\example2.csv', 'Address,Date,Name\n')]
因此,在制作的 csv 中,每个文件的所有属性都进入第二列,使其看起来像这样(由于某种原因,中间有一个空行): New CSV file made
此外,在浏览文件时,我遇到了另一个错误:
UnicodeDecodeError: 'cp949' codec can't decode byte 0xed in position 6: illegal multibyte sequence
所以我在第一行包含了这段代码,但它没有说文件无效。
import codecs
files=glob.glob('C:/example/*.csv')
fileObj = codecs.open( files, "r", "utf-8" )
我在 stackflow 上阅读了答案,但找不到与我的问题相关的答案。感谢您的回答。
【问题讨论】:
-
首先,你不应该使用
list作为变量名。 -
如果我正确理解您的目标,请尝试将
a=[file,f.readline()]替换为a = next(reader),如果可行,请告诉我。 -
另外,您正在使用
with ... as ...对您的 outfile 遵循良好的上下文管理器实践,但您也应该对每个 infile 执行此操作。 -
@JasonStein 列一个这样的列表是我的目标。
("Filename","Column1","Column2"]。 reader 没有定义,是在不同的模块中吗? -
对不起!没有仔细阅读。既然您已经在使用
csv,您是否检查过csv.reader的文档?它将创建一个生成器,一次读取一行 csv。调用next将读取一行。所以我的建议是:for file in files: with open(file, 'r') as infile: reader = csv.reader(infile), headers = next(reader)(对单行表示歉意,应该是 4)。那么headers将是标题列表,file将是字符串形式的文件名。