【发布时间】:2018-02-17 12:14:41
【问题描述】:
输入文件:
$ cat test.csv
company,spread,cat1,cat2,cat3
A,XYZ,32,67,0
B,XYZ,43,0,432
C,XYZ,32,76,32
D,XYZ,454,87,43
E,XYZ,0,0,65
F,XYZ,0,0,7
预期的 CSV 输出(合计列 cat1、cat2 和 cat3 并附加总和。):
$ cat test.csv
company,spread,cat1,cat2,cat3
A,XYZ,32,67,0
B,XYZ,43,0,432
C,XYZ,32,76,32
D,XYZ,454,87,43
E,XYZ,0,0,65
F,XYZ,0,0,7
,,561,230,579
代码:
import csv
all_keys = ['cat1', 'cat2', 'cat3']
default_values = {i: 0 for i in all_keys}
def read_csv():
with open('test.csv', 'r') as f:
reader = csv.DictReader(f)
yield from reader
for row in read_csv():
for i in all_keys:
default_values[i] += int(row[i])
with open('test.csv', 'a') as w:
writer = csv.DictWriter(w, fieldnames=all_keys)
writer.writerow(default_values)
实际输出:
$ cat test.csv
company,spread,cat1,cat2,cat3
A,XYZ,32,67,0
B,XYZ,43,0,432
C,XYZ,32,76,32
D,XYZ,454,87,43
E,XYZ,0,0,65
F,XYZ,0,0,7
561,230,579
问题:
csv.DictWriter 未附加具有正确列对齐的行。我知道我有 5 列,但我只提供 3 列的值。但我认为这是DictWriter,它只会将值附加到匹配的列标题。如果我打开我的Actual Output CSV,很明显列没有对齐:
【问题讨论】:
-
可选的 restval 参数指定当字典缺少字段名中的键时要写入的值。从这里docs.python.org/3/library/csv.html。所以 DictWriter(f, fieldnames, restval="....) 应该可以工作