2016-08-23 93 views
0

我想将多个csv文件追加到使用python的单个csv文件中,同时添加文件名(或者,甚至更好,文件的子字符串名称)作为一个新变量。所有文件都有标题。下面的脚本执行合并文件的把戏,但不包括文件名可变问题:合并几个csv文件并将文件名存储为变量 - Python

import glob 

filenames=glob.glob("/filepath/*.csv") 

outputfile=open("out.csv","a") 

for line in open(str(filenames[1])): 
outputfile.write(line) 

for i in range(1,len(filenames)): 
    f = open(str(filenames[i])) 
    f.next() 
    for line in f: 
    outputfile.write(line) 

outputfile.close() 

如果有什么好的建议我想知道。我有大约25k个小尺寸的csv文件(每个小于100KB)。

+0

从您的代码判断,它看起来像所有文件具有相同的数量和类型的列。它是否正确?你有意跳过第一个文件吗? –

+0

'filenames'是否包含你想要的文件名列表?你还希望完成什么? – FamousJameous

+0

@FamousJameous我的思维阅读技巧告诉我,通过“将文件名称存储为变量”,OP意味着向包含每行起源文件名的输出文件添加一列。 –

回答

0

您可以使用Python的csv模块解析CSV文件给你,并格式化输出。示例代码(未经测试):

import csv 

with open(output_filename, "wb") as outfile: 
    writer = None 
    for input_filename in filenames: 
     with open(input_filename, "rb") as infile: 
      reader = csv.DictReader(infile) 
      if writer is None: 
       field_names = ["Filename"] + reader.fieldnames 
       writer = csv.DictWriter(outfile, field_names) 
       writer.writeheader() 
      for row in reader: 
       row["Filename"] = input_filename 
       writer.writerow(row) 

的几个注意事项:

  • 始终使用with打开文件。这样可以确保他们在完成任务后会再次关闭。您的代码没有正确关闭输入文件。
  • CSV文件应该以二进制模式打开。
  • 指数从Python开始0。您的代码会跳过第一个文件,并将第二个文件中的行包含两次。如果你只是想迭代一个列表,你不需要在Python中使用索引。改用for x in my_list即可。
0

简单的改变将实现你想要什么: 对于第一线

outputfile.write(line) -> outputfile.write(line+',file') 

后来

outputfile.write(line+','+filenames[i]) 
+0

请注意,您的for循环的索引超出范围是反模式,您应该使用'for filename in filenames'。 – mdurant