我有一个包含超过15,000个csv文件的文件夹。它们都有不同数量的列名。
大多数文件的第一行作为列名(数据属性),如下所示:
...object
我想要做的是读取所有文件的第一行,将它们存储为列表,并将该列表写为新的csv文件。
这是我到目前为止所做的:
Name Date Contact Email
a b c d
a2 b2 c2 d2
当我尝试使用此代码时,结果如下:
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)
因此,在一个make csv中,每个文件的所有属性都进入第二列,使它看起来像这样(出于某种原因,它们之间是空行): New CSV file made
此外,在浏览文件时,我遇到了另一个错误:
[('C:/example\\example.csv', 'Name,Date,Contact,Email\n'), ('C:/example\\example2.csv', 'Address,Date,Name\n')]
所以我在第一行包含了这段代码,但它没有说文件是无效的。
UnicodeDecodeError: 'cp949' codec can't decode byte 0xed in position 6: illegal multibyte sequence
我在stackflow上阅读了答案,但我找不到与我的问题相关的答案。我很感激你的回答。
答案 0 :(得分:0)
好的,所以
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)
在这里你打开文件,然后创建一个列标题为列的字符串(注意这意味着它们看起来像" Column1,Column2")和文件名。所以[("文件名"," Column1,Column2")] 因此,您需要将其拆分为','像:
for file in files :
f = open(file)
a=[file] + f.readline().split(',')
现在我们有:
["filename", ("Column1", "Column2")]
所以它仍然会打印错误的文件。我们需要连接列表。
a=[file] + f.readline().split(',')
所以我们得到:
["filename", "Column1", "Column2"]
您应该在使用f.close()
打开文件后关闭每个文件,或者在循环中使用上下文管理器,如:
for file in files :
with open(file) as f:
a=[file] + f.readline()
list.append(a)
更好的解决方案以及我将如何编写它:
import csv
import glob
files = glob.glob('mydir/*.csv')
lst = list()
for file in files:
with open(file) as f:
reader = csv.reader(f)
lst.append(next(reader))
try:
with open(files,'r'.encoding='utf8') as f:
# do things
except UnicodeError:
with open(files,'r'.encoding='utf8') as f:
# do things
答案 1 :(得分:0)
一点点整理,适当的上下文管理,并使用csv.reader
:
import csv
import glob
list=[]
files=glob.glob('C:/example/*.csv')
with open('test.csv', 'w') as testfile:
csv_writer = csv.writer(testfile)
for file in files:
with open(file, 'r') as infile:
reader = csv.reader(infile)
headers = next(reader)
lst = [file] + headers
writer.writerow(lst)
这会写一个新的csv,每个infile一行,每行filename, column1, column2, ...