【问题标题】:How to write information from a list to a csv file using csv DictWriter?如何使用 csv DictWriter 将列表中的信息写入 csv 文件?
【发布时间】:2018-01-06 17:15:03
【问题描述】:

使用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]

【问题讨论】:

  • names 必须是字典列表。

标签: python csv


【解决方案1】:

csv.DictWriter 类的writerow() 函数期望参数为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

【讨论】:

  • 感谢您的帮助,使用 zip 函数创建元组并使用 dict 函数创建基于 firstindex 为键,第二个为值的字典,对吗?
  • @CodingRonald Nope, zip(fieldnames2, names) 通过将两个列表合并在一起来创建元组。其中dict(my_tuple) 将创建dict 对象,其中元组中的第0 个索引作为键,第一个索引作为它的值。运行它并自己尝试。你会明白的:)
  • 哈哈,非常感谢我刚才所说的,没有所有的解释,但是感谢您分解它,我们需要更多这样的 cmets 供以后查看的人使用。
【解决方案2】:

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

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

我已将names 更改为包含所有行的列表列表,将DictWriter 更改为writer。 然后删除 writeheaderwriterow 的标题。还在列表列表中使用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 上每隔一行有一个空行。

【讨论】:

  • 是的,感谢您的提醒,这是一个测试,但为了回答您的回复,我使用的是 dictwriter 而不是简单地使用 writer,以使数据易于访问,但无论如何这是一个很好的解决方案,谢谢。
  • 选择哪个作家真正取决于您的输入。您的输入似乎更适合(在您的测试中)一个简单的writer
猜你喜欢
  • 2020-05-21
  • 2020-01-08
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 2016-09-26
相关资源
最近更新 更多