我正在尝试将复杂的字典列表写入 CSV,但出现编码和值错误。我还没有真正使用过 Python 中的数据,所以我是新手。
import csv
with open("output.csv", 'rb', encoding='utf-8-sig', newline='') as f:
writer = csv.writer(f, delimiter=",")
for row in row_num:
writer.writerows(row_num)
Traceback (most recent call last):
File "<console>", line 1, in <module>
ValueError: binary mode doesn't take a newline argument
如果我删除编码,我会得到:io.UnsupportedOperation: write
。
这是我要写入 CSV 文件的数据示例,其中 header 是 code
和 hid
之类的键:
[OrderedDict([('code', '7nsdjfk'), ('hid', '220'), ('name', 'sdjlnj dkldk slkdlkd'), ('code2', '99'), ('description', 'dmldc skdlmls wsldfml'), ('average', '0'), ('ccr', '0.218'), ('ccr_price', '399'), ('dusk sdks', '603'), ('dcfl lldcml', '3847.9'), ('id', 'sdklcldkcdslkcmsdl202i')]), OrderedDict([ ...]), OrderedDict([...])]
请您参考如下方法:
将模式更改为纯文本
CSV 代表逗号分隔值。此格式包含纯文本。
此外,'rb'
表示读取 r
二进制文件 b
,这与纯文本不一致。
尝试使用 'wt'
或仅使用 'w'
来实际编写一个纯文本文件。
Check the python docs了解有关 open()
函数的更多信息。
编辑:将数据写入文件
我想出了这个解决方案:
csv.writer
被替换为csv.DictWriter
,后者接收keys
writer.writeheader()
将keys
作为以逗号分隔的 header 插入writer.writerows(row_num)
将值写入文件,每个OrderedDict
一行
from collections import OrderedDict
import csv
row_num = [OrderedDict([('code', '7nsdjfk'), ('hid', '220'), ('name', 'sdjlnj dkldk slkdlkd'), ('code2', '99'), ('description', 'dmldc skdlmls wsldfml'),
('average', '0'), ('ccr', '0.218'), ('ccr_price', '399'), ('dusk sdks', '603'), ('dcfl lldcml', '3847.9'), ('id', 'sdklcldkcdslkcmsdl202i')]),
OrderedDict([('code', 'a'), ('hid', '1'), ('name', 'b'), ('code2', '1'), ('description', 'c'),
('average', '1'), ('ccr', '0.123'), ('ccr_price', '133'), ('dusk sdks', '133'), ('dcfl lldcml', '1345.9'), ('id', 'abcde')]),
]
keys = row_num[0].keys()
with open("output.csv", 'wt', encoding='utf-8-sig', newline='') as f:
writer = csv.writer(f, delimiter=",")
writer = csv.DictWriter(f, keys)
writer.writeheader()
# write values
writer.writerows(row_num)
output.csv
中的结果是:
code,hid,name,code2,description,average,ccr,ccr_price,dusk sdks,dcfl lldcml,id
7nsdjfk,220,sdjlnj dkldk slkdlkd,99,dmldc skdlmls wsldfml,0,0.218,399,603,3847.9,sdklcldkcdslkcmsdl202i
a,1,b,1,c,1,0.123,133,133,1345.9,abcde