2016-11-23 79 views
2

我试图将字典打印到CSV并在运行代码时收到此错误。Dictionary to CSV - Python

错误:ValueError异常:字典包含字段不是在字段名: '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的:“海峡'对象没有属性‘GET’

作为附带说明,当我运行的代码块上面

dict_writer.writerow(dic) 

在最后一行中,它向CSV输出一个URL,没有错误。

有什么想法?

回答

0

那么你试图写多行,与writerows方法,但你只提供1行。您需要提供包含正确密钥的列表,其中包含字典。当Python尝试在循环时将列表拆分为单个对象时,它会失败,因为它试图拆分一个对象。这也是为什么writerow(没有)为你工作,因为你只提供一个字典。

总之,提供一个词典列表,而不是一个。

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) 
0

看起来像你的dic = {}每次在循环中创建一个空白字典。如果你打算这样做的话,那么你必须在“with open”块内部有这个循环(所以这个空白字典被创建,然后每次写入)。并在那一点上,它会是“writerow

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

0

自己居然那么容易,因为如果你只想做这一切在一次以下几点:

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

其中itemDict是你的字典转换。