2016-11-23 155 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是你的字典轉換。