2011-12-31 59 views
53

我有一本字典:的Python:編寫詞典到CSV文件有一個行每一個「鍵:值」

mydict = {key1: value_a, key2: value_b, key3: value_c}

我想將數據寫入到文件dict.csv在這種風格:

key1: value_a 
key2: value_b 
key3: value_c 

我寫道:

import csv 
f = open('dict.csv','wb') 
w = csv.DictWriter(f,mydict.keys()) 
w.writerow(mydict) 
f.close() 

但現在我有一行和所有VALU所有鍵es在下一行..

當我設法寫這樣的文件,我也想讀回到一個新的詞典。

爲了解釋我的代碼,該字典包含textctrls和複選框(使用wxpython)的值和布爾值。我想添加「保存設置」和「加載設置」按鈕。 保存設置應該以上述方式將字典寫入文件(爲了讓用戶更容易直接編輯csv文件),加載設置應該從文件中讀取並更新文本和複選框。

+1

你能提供一個更好的例子,你想要輸出什麼?上面的「樣式」不是CSV。你在找'key1,value_a [linebreak] key2,value_b [linebreak] key3,value_c'? – tkone 2011-12-31 02:09:59

+0

另一種方法是使用'repr()'將dict寫出來,然後在讀入字符串時對它進行評估。看看這個[old SO post](http://stackoverflow.com/questions/1436703/difference- (str)和repr-in-python之間)討論'str()'與'repr()'和[文檔](http://docs.python.org/library/functions.html #repr)。 – 2011-12-31 02:18:42

+0

除了我下面的回答,如果你喜歡比簡單的CSV文件更復雜一點的東西,你可能想要檢查'ConfigParser'模塊 – 2011-12-31 02:29:56

回答

121

DictWriter不工作,你所期望的方式。

with open('dict.csv', 'wb') as csv_file: 
    writer = csv.writer(csv_file) 
    for key, value in mydict.items(): 
     writer.writerow([key, value]) 

讀回:

with open('dict.csv', 'rb') as csv_file: 
    reader = csv.reader(csv_file) 
    mydict = dict(reader) 

這是相當緊湊,但它假定你不需要做任何類型的轉換閱讀

+1

Mmh ...剛注意到你想要的是一種不完全類似於CSV的特定格式。假設您想要CSV樣式(即每個鍵值對有一行),因爲您使用的是CSV模塊... – 2011-12-31 02:25:46

+2

或...如果CSV方法正是您想要的,但您更喜歡「:」as一個分隔符,只需在創建作者和讀者時添加'delimiter =':'':) – 2011-12-31 02:28:16

+0

寫作和閱讀現在可以正常工作,但我還想根據字典中的值更新我的複選框和textctrls。我在「def create_controls」中有所有我的小部件,當我啓動我的程序時會調用它。但從我的csv閱讀後再次調用它不會更新我的小部件的狀態...你知道什麼是最好和最簡單的方式來更新/刷新它們嗎? – user1106770 2011-12-31 14:12:04

2

可你只是做:

for key in mydict.keys(): 
    f.write(str(key) + ":" + str(mydict[key]) + ","); 

所以,你可以有

key_1:_1,key_2:_2

+3

Better will (「%s:%s」%(k,v)for k,v in mydict.items())'''''''''''''''''''價值一起,而不是一個字典的鍵和做'n'值查找。 '','。join(...)'只處理值之間的逗號,而不添加額外的尾部逗號。 – PaulMcG 2011-12-31 03:24:45

+0

謝謝@PaulMcGuire – 2011-12-31 08:35:56

1

當我個人一直找到了csv模塊有點煩人。我希望別人會告訴你如何做到這一點slickly用它,但我的快速和骯髒的解決方案是:

with open('dict.csv', 'w') as f: # This creates the file object for the context 
            # below it and closes the file automatically 
    l = [] 
    for k, v in mydict.iteritems(): # Iterate over items returning key, value tuples 
     l.append('%s: %s' % (str(k), str(v))) # Build a nice list of strings 
    f.write(', '.join(l))      # Join that list of strings and write out 

但是,如果你想回來看它,你需要做一些刺激性解析特別是如果它全部在一條線上的話。這裏有一個使用你提出的文件格式的例子。

with open('dict.csv', 'r') as f: # Again temporary file for reading 
    d = {} 
    l = f.read().split(',')  # Split using commas 
    for i in l: 
     values = i.split(': ') # Split using ': ' 
     d[values[0]] = values[1] # Any type conversion will need to happen here 
+0

我會與裏卡多的回答一起去。或者至少使用單獨的行。 – 2011-12-31 02:24:57

3
outfile = open('dict.txt', 'w') 
for key, value in sorted(mydict.items()): 
    outfile.write(str(key) + '\t' + str(value) + '\n') 
+1

請在回答中提供一些信息或評論。 – NDM 2013-09-25 12:42:09

10

最簡單的辦法就是置之不理csv模塊和自己格式化。

with open('my_file.csv', 'w') as f: 
    [f.write('{0},{1}\n'.format(key, value)) for key, value in my_dict.items()] 
+4

如果你的'key'得到一個逗號,你將會有一段糟糕的時間。 – 2016-10-11 08:50:28

+2

我發現使用'csv.writer(...).saubles(my_dict.items())'更容易。 'csv'模塊不僅僅是添加逗號和換行符。 – 2017-04-14 11:36:25

2

只要給出一個選項,也可以使用pandas軟件包來編寫一個字典到csv文件。在給定的例子可能是這樣的:

mydict = {'key1': 'a', 'key2': 'b', 'key3': 'c'}

import pandas as pd 

(pd.DataFrame.from_dict(data=mydict, orient='index') 
    .to_csv('dict_file.csv', header=False)) 

考慮的主要問題是對「東方」參數設置爲「索引」的from_dict方法內。這使您可以選擇是否要將每個字典密鑰寫入新行。

另外,在to_csv方法中,header參數設置爲False,只是爲了讓字典元素沒有惱人的行。您始終可以在 to_csv方法內設置列和索引名稱。

你的輸出應該是這樣的:

key1,a 
key2,b 
key3,c 

相反,如果你想要的鍵是列的名字,只使用默認的「東方」參數是「列」,因爲你可以在檢查文檔鏈接。

相關問題