Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python CSV行追加:DictWriter始终从第一列写入_Python_Csv - Fatal编程技术网

Python CSV行追加:DictWriter始终从第一列写入

Python CSV行追加:DictWriter始终从第一列写入,python,csv,Python,Csv,输入文件: $ 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 import csv all_keys = ['cat1', 'cat2', 'cat3'] default_values = {i: 0 for i in all_keys} def read_csv(): w

输入文件:

$ 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
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输出(求和列
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
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
实际输出:

$ 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
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
问题:

$ 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
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,它将只向匹配的列标题追加值。如果我打开我的
实际输出
CSV,很明显列没有对齐:


您应该在
字段名中包含前两个的列名

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

如果字典中没有键,则前两列将写入空白值。

您可以这样声明您的编写器:

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

因此,您不必指定所有缺少的键:对于所有缺少的键,restval char将使用您选择的值填充

可选的restval参数指定如果字典在字段名中缺少键,则要写入的值。从这里开始。所以DictWriter(f,fieldnames,restval=“…)应该工作,我试过了。但它不起作用。结果和以前一样。我的代码有问题吗?它就像
restval
参数一样被完全忽略。我已经接受了@moses的答案。但是,我想知道为什么
restval
不适合我+1您的时间。@slayedbylucifer
restval
仅适用于
字段名中存在的键。事实上,我的解决方案也使用了
restval
,其默认值为
'
;我不需要明确地传递它。