我试图打开一个源文件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,b2016-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)问题是,它只是写入每个文件的第一行,而不会在编写时自动转到下一行。我怎样才能解决这个问题?
发布于 2016-11-01 19:25:36
每次使用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)发布于 2016-11-01 19:23:55
您正在用'w'覆盖前面的文件。除了打开文件并在每次迭代中结束之外,不是一个非常好的主意。
为什么不使用每一行中的第一项(即日期)作为分组标准来读取所有行并使用itertools.groupby对它们进行分组。然后在拆分后写入每个文件。文件names将是每个组的关键。
https://stackoverflow.com/questions/40367161
复制相似问题