使用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)
我见过与此主题相关的其他问题,但是尼姑适用于我。
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]
答案 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上的每隔一行都会有一个空行。