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

时间:2018-01-06 09:02:34

标签: python csv

使用csv模块,我一直试图使用dictwriter将信息从列表传递/写入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)

我见过与此主题相关的其他问题,但是尼姑适用于我。

ERROR:

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]

2 个答案:

答案 0 :(得分:2)

writerow()类的

csv.DictWriter函数需要参数为dict,而您将字符串传递给它。 csv.DictWriter document中明确提到了这一点:

  

创建一个像普通作家一样操作的对象但是映射   字典到输出行。 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

答案 1 :(得分:2)

在您的代码中,info应该是一个字典,来自字典列表。它目前是一个字符串...

无论如何,您的数据集更适合简单的csv.writer

我已将names更改为包含所有行的列表列表,已将DictWriter更改为writer。 然后删除writeheader的{​​{1}}标题。还在列表列表中使用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) (python 3)或您的csv文件在Windows上的每隔一行都会有一个空行。