【问题标题】:Dictionary to CSV - Python字典到 CSV - Python
【发布时间】:2016-11-23 17:57:34
【问题描述】:

我正在尝试将字典打印到 CSV 并在运行代码时收到此错误。

错误:ValueError:dict 包含不在字段名中的字段:'u'、'r'、'l'

from nytimesarticle import articleAPI
import csv
api = articleAPI('API Key')

res = api.search( q = ['Abbott Laboratories'],
    fq = {'source':['The New York Times']},
    begin_date = 20110101, end_date = 20131231,
    facet_field = ['source'], facet_filter = True)

for m in res['response']['docs']:
    dic = {}
    dic['url'] = m['web_url']
    dic['id'] = m['_id']
    print dic

with open('Abbot_test.csv', 'wb') as output_file:
    dict_writer = csv.DictWriter(output_file, ('url', 'id'))
    dict_writer.writeheader()
    dict_writer.writerows(dic)

当我和

一起跑步时
dict_writer = csv.DictWriter(outputfile, ('url', 'id', 'u', 'r', 'l')

错误:AttributeError:“str”对象没有属性“get”

附带说明,当我使用

运行上面的代码块时
dict_writer.writerow(dic)

在最后一行,它将单个 url 打印到 CSV,没有错误。

有什么想法吗?

【问题讨论】:

    标签: python csv dictionary


    【解决方案1】:

    好吧,您尝试使用 writerows 方法写入多行,但您只提供 1 行。您需要提供一个包含正确键的字典列表。当 Python 在循环时尝试将列表拆分为单个对象时,它会失败,因为它尝试拆分一个对象。这也是为什么 writerow (no s) 适合你的原因,因为你只提供一个字典。

    简而言之,提供一个字典列表,而不是一个。

    dict_writer.writerows([dic])
    

    但您似乎只是在创建一个并重写它 - 您可能希望将其写入一个列表。

    dictlist = []
    for m in res['response']['docs']:
        dic = {}
        dic['url'] = m['web_url']
        dic['id'] = m['_id']
        dictlist.append(dic)
    
    dict_writer.writerows(dictlist)
    

    【讨论】:

      【解决方案2】:

      writerows 的参数必须是 dicts 的可迭代对象。 csv 中的每一行都由一个 dict 表示。当你应该收集它们时,你继续覆盖相同的dict

      dics = []  # desired structure: [{..}, {..}, ...]
      for m in res['response']['docs']:
          dic = {}
          dic['url'] = m['web_url']
          dic['id'] = m['_id']
          dics.append(dic)
      
      # ....
      dict_writer.writerows(dics)
      

      Writerows 遍历您传递给它的任何内容,假设遍历 dicts,它会调用 get 方法,如果它实际上遍历单个 dict 的字符串 keys,则会失败。

      【讨论】:

        【解决方案3】:

        看起来您的dic = {} 每次在循环中都会创建一个空白字典。如果你要这样做,那么你必须在“with open”块内有那个循环(这样就创建了空白字典,然后每次都写入)。那时它将是“writerow

        【讨论】:

          【解决方案4】:

          如果您只想一次完成所有操作,实际上就像以下一样简单:

          listWriter = csv.DictWriter(
             open('FULL_PATH/output.csv', 'wb'),
             fieldnames=itemDict[itemDict.keys()[0]].keys(),
             delimiter=',',
             quotechar='|',
             quoting=csv.QUOTE_MINIMAL
          )
          

          其中 itemDict 是您要转换的字典。

          【讨论】:

            猜你喜欢
            • 2021-04-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-02
            • 2015-08-21
            相关资源
            最近更新 更多