字典到CSV - Python

时间:2016-11-23 17:57:35

标签: python csv dictionary

我正在尝试将字典打印到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)

在最后一行,它会向CSV打印一个没有错误的网址。

有什么想法吗?

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您正在尝试使用writerows方法编写多行,但您只提供1行。您需要提供包含正确密钥的dicts列表。当Python在循环时尝试将列表拆分为单个对象时,它会因为尝试拆分一个对象而失败。这也是writerow(没有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 :(得分:0)

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方法,如果它实际上迭代单个keys dict,则会失败1}}。

答案 3 :(得分:0)

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

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

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