如何在Python中合并200个CSV文件
伙计们,我在这里有200个独立的csv文件,从SH(1)到SH(200)命名。 我想合并成一个单一的CSV文件。 我该怎么做?
正如ghostdog74所说,但是这个时候有了标题:
fout=open("out.csv","a") # first file: for line in open("sh1.csv"): fout.write(line) # now the rest: for num in range(2,201): f = open("sh"+str(num)+".csv") f.next() # skip the header for line in f: fout.write(line) f.close() # not really needed fout.close()
为什么你不能只是sed 1d sh*.csv > merged.csv
?
有时你甚至不必使用python!
fout=open("out.csv","a") for num in range(1,201): for line in open("sh"+str(num)+".csv"): fout.write(line) fout.close()
这取决于你的意思是“合并” – 他们是否有相同的列? 他们有头文件吗? 例如,如果它们全都具有相同的列,并且没有标题,那么简单的连接就足够了(打开目标文件进行写入,循环遍历打开每个源文件的源代码,使用shutil.copyfileobj从开放阅读源代码到开放的写作目的地,closures源代码,保持循环 – 使用with
语句代表您执行closures操作)。 如果它们具有相同的列,而且包含标题,则除了第一个源文件之外,每个源文件都需要一个readline
,在将其复制到目标文件之前将其打开之前,需要跳过标题行。
如果CSV文件不是全部具有相同的列,那么您需要定义在何种意义上“合并”它们(如SQL JOIN?或“水平”,如果它们具有相同数量的行等)等) – 在这种情况下,我们很难猜出你的意思。
我只是想通过另一个代码示例在篮子里
from glob import glob with open('singleDataFile.csv', 'a') as singleFile: for csvFile in glob('*.csv'): for line in open(csvFile, 'r'): singleFile.write(line)
使用接受的StackOverflow答案创build一个你想追加的csv文件的列表,然后运行这个代码:
import pandas as pd combined_csv = pd.concat( [ pd.read_csv(f) for f in filenames ] )
如果你想把它导出到一个单一的CSV文件,使用这个:
combined_csv.to_csv( index=False )
如果合并的CSV将在Python中使用,那么只需使用glob
获取要通过files
parameter passing给fileinput.input()
的files
,然后使用csv
模块一次性读取它。
上面的代码略有改动,因为它实际上并不正确。
它应该如下…
from glob import glob with open('main.csv', 'a') as singleFile: for csv in glob('*.csv'): if csv == 'main.csv': pass else: for line in open(csv, 'r'): singleFile.write(line)
您可以导入csv,然后循环读取所有CSV文件到列表中。 然后将列表写回到磁盘。
import csv rows = [] for f in (file1, file2, ...): reader = csv.reader(open("f", "rb")) for row in reader: rows.append(row) writer = csv.writer(open("some.csv", "wb")) writer.writerows("\n".join(rows))
以上是不是很强大,因为它没有error handling,也没有closures任何打开的文件。 无论单个文件是否有一行或多行CSV数据,这都应该起作用。 此外,我没有运行这个代码,但它应该给你一个想法做什么。
很容易合并目录中的所有文件并合并它们
import glob import csv # Open result file with open('output.txt','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: if h: h = False else: fin.next()#skip header for line in csv.reader(fin,delimiter=','): wout.writerow(line)
我修改了@wisty所说的与python 3.x一起工作,对于那些有编码问题的人,我也使用os模块来避免硬编码
import os def merge_all(): dir = os.chdir('C:\python\data\\') fout = open("merged_files.csv", "ab") # first file: for line in open("file_1.csv",'rb'): fout.write(line) # now the rest: list = os.listdir(dir) number_files = len(list) for num in range(2, number_files): f = open("file_" + str(num) + ".csv", 'rb') f.__next__() # skip the header for line in f: fout.write(line) f.close() # not really needed fout.close()