2011-11-30 178 views
20

我已經編寫代碼來將CSV讀取到Python字典中,該工具正常工作。我試圖讓字典回到CSV。我寫了以下內容:Python字典到CSV

import csv 

itemDict={} 

listReader = csv.reader(open('/Users/broberts/Desktop/Sum_CSP1.csv','rU'), delimiter = ',', quotechar='|') 

for row in listReader: 
    fID = row[0] 
    fClassRange = row[1] 
    fArea = row[2] 

    if itemDict.has_key(fID): 
     itemDict[fID][fClassRange]=fArea 
    else: 
     itemDict[fID] = {'5.0 to 5.25':'','5.25 to 5.5':'','5.5 to 5.75':'','5.75 to 6.0':'','6.0 to 6.25':'','6.25 to 6.5':'','6.5 to 6.75':'','6.75 to 7.0':'','7.0 to 7.25':'','7.25 to 7.5':'','7.5 to 7.75':'','7.75 to 8.0':'','8.0 to 8.25':'',} 
     itemDict[fID][fClassRange]=fArea 

listWriter = csv.writer(open('/Users/broberts/Desktop/Sum_CSP1_output.csv', 'wb'), delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) 

for a in itemDict: 
    print a 
    listWriter.writerow(a) 

在最後一個塊中,listWriter不會向CSV寫入任何內容,儘管它會打印出一個。我相信這與一本無序的字典有關。我真的需要寫出fID和與每個fID(fClassRange例如「5.0到5.25」)相關聯的每個鍵,然後將與每個fClassRange相關聯的值fArea寫入CSV,但是我甚至沒有得到那麼遠我的代碼,因爲我不知道如何寫出甚至fID。

我看着使用DictWriter,但我無法弄清楚如何告訴它什麼需要字段名是。

+0

要推薦肯尼斯·賴茨的[tablib(HTTP:// docs.python-tablib.org/en/latest/)。它不僅僅是你在這裏尋找的東西,所以這不是一個直接的答案,只是想把這個圖書館推薦給其他人。它有一個非常好用的API,你可以毫不費力地序列化爲csv,tsv,json,yaml和xlsx。 – hangtwenty

回答

18

默認的作家期望一個列表,這就是爲什麼它不適合你。要使用dictwriter,只是改變你的listwriter =行這樣的:

listWriter = csv.DictWriter(
    open('/Users/broberts/Desktop/Sum_CSP1_output.csv', 'wb'), 
    fieldnames=itemDict[itemDict.keys()[0]].keys(), 
    delimiter=',', 
    quotechar='|', 
    quoting=csv.QUOTE_MINIMAL 
) 

或者,你可以設置fieldnamesfieldnames=['arbitrary','list','of','keys']如果你知道的領域應該是。

+0

哇,謝謝!但現在我得到這個消息:ValueError:dict包含不在字段名中的字段:4,6,3,3,9 – bojo

+0

@bojo哎呀!你正在制定一個詞典的詞典。所以要得到正確的字段名,你需要*內部字典*字段名。另外,每個字典必須具有相同的字段名稱。否則,您需要爲不正確的字段名使用DictWriter選項。我已更新該行以使用正確的字典獲取字段名稱。 –

+0

對不起Spencer,我仍然收到相同的ValueError消息。 – bojo

1

爲後人:

您應該使用iteritems()來遍歷一個字典,所以最後一部分變成

for name, values in itemDict.iteritems(): 
    print values 
    listWriter.writerow(values) 
1

這是我使用的東西,它的簡單,我工作得很好。 你只有一個字典的時候,當你有一個字典列表,像什麼你從SQL查詢得到,你喜歡這款使用

my_dict = {"tester": 1, "testers": 2} 
with open('mycsvfile.csv', 'wb') as f: 
    w = csv.DictWriter(f, my_dict.keys()) 
    w.writerow(dict((fn,fn) for fn in my_dict.keys())) 
    w.writerow(my_dict) 

$ cat mycsvfile.csv 
testers,tester 
2,1 

my_dict = ({"tester": 1, "testers": 2},{"tester": 14, "testers": 28}) 
with open('mycsvfile.csv', 'wb') as f: 
    w = csv.DictWriter(f, my_dict[0].keys()) 
    w.writerow(dict((fn,fn) for fn in my_dict[0].keys())) 
    w.writerows(my_dict) 

cat mycsvfile.csv 
testers,tester 
2,1 
28,14 
1

的單行轉換http://stardict.sourceforge.net/Dictionaries.php下載到CSV列表,使用熊貓:

import pandas as pd 

mydict = [{"col1": 1000, "col2": 2000}, {"col1": 3000, "col2": 4000}] 

pd.DataFrame(mydict).to_csv('out.csv', index=False) 

結果:

col1,col2 
1000,2000 
3000,4000