在写入CSV文件时,Python不会自动转到下一行

时间:2016-11-01 19:19:58

标签: python csv

我正在尝试打开源CSV文件(source.csv)并根据第一列名称将其分解为多个CSV文件。我用这个例子来展示它:

source.csv的内容:

2016-11,a
2016-11,b
2016-12,a
2016-12,b
2016-12,c

我希望该程序能够使用2016-11.csv2016-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)

问题是它只写了每个文件的第一行,并且在写入时不会自动转到下一行。我该如何解决这个问题?

2 个答案:

答案 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)