[英]Writing CSV file with complex list data
我正在嘗試將復雜的字典列表寫入 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'
來實際編寫純文本文件。
查看 python 文檔以了解有關open()
函數的更多信息。
我想出了這個解決方案:
csv.writer
被csv.DictWriter
取代,它接收keys
writer.writeheader()
將keys
作為以逗號分隔的標題插入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
'rb'
代表“讀為二進制”。 因此,它考慮等效於二進制文件從文件中讀取數據。
根據文檔,它不需要任何額外的參數。 只需使用:
with open("output.csv", 'w') as f:
您可以嘗試使用'w'
代替'rb'
模式來寫入文件。
文檔中的話....
以二進制模式打開的文件(包括 mode 參數中的“b”)將內容作為字節對象返回,無需任何解碼。
模式:
'r' - open for reading (default)
'w' - open for writing, truncating the file first
'x' - open for exclusive creation, failing if the file already exists
'a' - open for writing, appending to the end of the file if it exists
'b' - binary mode
't' - text mode (default)
'+' - open a disk file for updating (reading and writing)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.