我正在尝试打开源CSV文件(source.csv
)并根据第一列名称将其分解为多个CSV文件。我用这个例子来展示它:
source.csv
的内容:
2016-11,a
2016-11,b
2016-12,a
2016-12,b
2016-12,c
我希望该程序能够使用2016-11.csv
和2016-12.csv
名称创建两个文件:
预期内容2016-11.csv
:
2016-11,a
2016-11,b
预期内容2016-12.csv
:
2016-12,a
2016-12,b
2016-12,c
我开发了这段代码:
import csv
path1='/home/sourcefilepath/'
path2='/home/targetpath/'
filename='source.csv'
with open(path1+filename) as f:
reader = csv.reader(f)
for row in reader:
date=row[0]
with open(path2+date+'.csv', 'w') as csvfile:
writer = csv.writer(csvfile, delimiter=',')
writer.writerow(row)
问题是它只写了每个文件的第一行,并且在写入时不会自动转到下一行。我该如何解决这个问题?
答案 0 :(得分:2)
您使用'w'
覆盖以前的文件。除了打开文件并在每次迭代时关闭都不是一个好主意。
为什么不读取所有行并使用itertools.groupby
使用每行中的第一项(即日期)作为分组标准对它们进行分组。然后在拆分后写入每个文件。文件name
将是每个组的密钥。
答案 1 :(得分:2)
每次使用w
标记打开文件时,您都会覆盖文件内容,请尝试使用itertools.groupby
对行进行分组:
import csv
import itertools
with open(path1 + filename) as f:
reader = csv.reader(f)
for date, rows in itertools.groupby(reader, lambda row: row[0]):
with open(path2 + date + '.csv', 'w') as csvfile:
writer = csv.writer(csvfile, delimiter=',')
writer.writerows(rows)