我是Python的初学者。我有多个CSV文件(超过10个),它们都有相同的列数。我想合并到一个单一的CSV文件,在那里我不会有重复的标题。
因此,从本质上讲,我只需要有第一行的所有标题,从那时起,我需要所有的CSV文件合并的所有行。我该怎么做?
这是我目前为止尝试的。
import glob
import csv
with open('output.csv','wb') as fout:
wout = csv.writer(fout,delimiter=',')
interesting_files = glob.glob("*.csv")
for filename in interesting_files:
print 'Processing',filename
# Open and process file
h = True
with open(filename,'rb') as fin:
fin.next()#skip header
for line in csv.reader(fin,delimiter=','):
wout.writerow(line)
5条答案
按热度按时间myss37ts1#
如果你使用的是Linux系统:
wkyowqbh2#
虽然我认为最好的答案是来自@valentin的答案,但你可以在不使用
csv
模块的情况下做到这一点:acruukt93#
如果你不介意开销,你可以使用pandas,它是常见的python发行版附带的。如果您计划使用speadsheet表做更多的事情,我建议您使用pandas,而不是尝试编写自己的库。
关于Pandas的更多信息。因为它是用来处理类似于电子表格的数据的,所以它知道第一行是标题。当阅读CSV时,它将数据表与头部分离,头部作为
dataframe
的元数据保存,dataframe
是pandas中的标准数据类型。如果你连接几个这样的dataframes
,它只连接数据部分,如果它们的头是相同的。如果标题不相同,则失败并给出错误。这可能是一件好事,以防你的目录被其他来源的CSV文件污染。还有一件事我只是在
interesting_files
周围添加了sorted()
。我假设你的文件是按顺序命名的,这个顺序应该保持下去。我不确定glob,但os
函数不一定会返回按名称排序的文件。g2ieeal74#
你的尝试几乎是工作,但问题是:
下面是正确的代码,直接将csv对象传递给
csv.writerows
方法,以获得更短更快的代码。也将标题从第一个文件写入输出文件。请注意,使用原始逐行处理的解决方案忽略了重要的一点:如果标题是多行的,他们会失败,拙劣的标题行/重复它的一部分几次,有效地破坏文件。
csv模块(或者pandas)可以很好地处理这些情况。
xfyts7mz5#
你的缩进是错误的,你需要把循环放在with块里面。您还可以将文件对象传递给writer.writerows。