簡體   English   中英

如何使用csv DictWriter將列表中的信息寫入csv文件?

[英]How to write information from a list to a csv file using csv DictWriter?

使用csv模塊,我一直在嘗試使用dictwriter在python中將列表中的信息傳遞/寫入python的csv文件,並且出現一個奇怪的錯誤,女巫將處於實際代碼之下。 我想知道什么,代碼中的錯誤以及如何解決。

import csv 

names = ['kisha' ,'smith'  , 'kishasmith@gmail.com', 40000  ,  '1-1-2029'   ,'janitor' ]

with open('employees.csv' , 'w')as employee_file:
     fieldnames2 = ['first' , 'last' , 'email' , 'salary' , 'DOB' , 'occupation']
     csvwriter = csv.DictWriter(employee_file , fieldnames = fieldnames2 , delimiter = ',')
     csvwriter.writeheader()
     for info in names:
        csvwriter.writerow(info)

我看過其他與此主題相關的問題,但尼姑適用於我。

錯誤:

Traceback (most recent call last):
  File "C:\Users\Kxrk\Downloads\Codes\Employee project\new.py", line 10, in <module>
    csvwriter.writerow(info)
  File "C:\Users\Kxrk\AppData\Local\Programs\Python\Python36-32\lib\csv.py", line 155, in writerow
    return self.writer.writerow(self._dict_to_list(rowdict))
  File "C:\Users\Kxrk\AppData\Local\Programs\Python\Python36-32\lib\csv.py", line 148, in _dict_to_list
    wrong_fields = rowdict.keys() - self.fieldnames
AttributeError: 'str' object has no attribute 'keys'
[Finished in 0.1s]

csv.DictWriter類的writerow()函數期望該參數為dict ,而您正在向其傳遞字符串。 csv.DictWriter文檔中明確提到:

創建一個操作類似於常規編寫器的對象,但將字典映射到輸出行。 fieldnames參數是一個鍵序列,用於標識字典中傳遞給writerow()方法的值寫入csvfile的順序。

為了使其工作,請傳遞dict對象(帶有csv標頭和相應列值之間的映射) 例如:

import csv

names = ['kisha' ,'smith'  , 'kishasmith@gmail.com', 40000  ,  '1-1-2029'   ,'janitor' ]
fieldnames2 = ['first' , 'last' , 'email' , 'salary' , 'DOB' , 'occupation']

# for creating the dictionary object mapping "names" and "fieldnames2"
my_names_dict = dict(zip(fieldnames2, names))

with open('/path/to/my_file.csv' , 'w')as employee_file:
     csvwriter = csv.DictWriter(employee_file , fieldnames = fieldnames2 , delimiter = ',')
     csvwriter.writeheader()
     csvwriter.writerow(my_names_dict)

上面的代碼將創建一個文件/path/to/my_file.csv ,其內容為:

first,last,email,salary,DOB,occupation
kisha,smith,kishasmith@gmail.com,40000,1-1-2029,janitor

在您的代碼中, info應該是字典,來自字典列表。 目前是一個字符串...

無論如何,您的數據集更適合於簡單的csv.writer

我將names更改為包含所有行的列表列表,將DictWriter更改為writer 然后刪除帶有標題的writeheader以進行writerow 也用於writerows列出的名單上更好的速度(避免了循環):

import csv

names = [ ['kisha' ,'smith'  , 'kishasmith@gmail.com', 40000  ,  '1-1-2029'   ,'janitor' ],
         # more employees here
          ]

with open('employees.csv' , 'w', newline="") as employee_file:
     fieldnames2 = ['first' , 'last' , 'email' , 'salary' , 'DOB' , 'occupation']
     csvwriter = csv.writer(employee_file , delimiter = ',')
     csvwriter.writerow(fieldnames2)
     csvwriter.writerows(names)

還要注意,您需要newline="" (Python 3),否則您的csv文件在Windows上每隔一行將有一個空白行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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