【问题标题】:CSV row appending: DictWriter always writes from first columnCSV 行附加:DictWriter 始终从第一列写入
【发布时间】: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 输出(合计列 cat1cat2cat3 并附加总和。):

$ 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="....) 应该可以工作

标签: python csv


【解决方案1】:

你可以这样声明你的作家:

with open('test.csv', 'a') as w:
    writer = csv.DictWriter(w, fieldnames=all_keys, restval=' ')
    writer.writerow(default_values)

因此您不必指定所有缺少的键:对于所有缺少的键,restval char 将填充您选择的值。 https://docs.python.org/3/library/csv.html#csv.DictWriter

【讨论】:

  • 我试过了。但它不起作用。结果和以前一样。我的代码有问题吗?它与restval 参数一样被完全忽略。
  • 我接受了@moses 的回答。但是,我很想知道为什么 restval 不适合我。为您的时间 +1。
  • @slayedbylucifer restval 仅适用于存在于 fieldnames 中的密钥。事实上我的解决方案也使用restval,其默认值为'';我不需要明确传递它。
【解决方案2】:

您应该在fieldnames 中包含前两个的列名:

with open('test.csv', 'a') as w:
    writer = csv.DictWriter(w, fieldnames=['company', 'spread']+all_keys)
    writer.writerow(default_values)

如果字典中的键不可用,则会将空白值写入前两列。

【讨论】:

    猜你喜欢
    • 2021-08-16
    • 2023-03-13
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    • 2014-07-30
    相关资源
    最近更新 更多