簡體   English   中英

使用復雜的列表數據寫入 CSV 文件

[英]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 是鍵,如codehid

 [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.writercsv.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM