我正在尝试将字典打印到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打印一个没有错误的网址。
有什么想法吗?
答案 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是您要转换的字典。