web-dev-qa-db-ja.com

'key:value'ごとに1行の辞書を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()

しかし、今では1つの行にすべてのキーがあり、次の行にすべての値があります。

このようなファイルをなんとか書き込めば、新しい辞書に読み戻したいと思います。

私のコードを説明するために、辞書にはtextctrlとチェックボックスからの値とブール値が含まれています(wxpythonを使用)。 「設定を保存」ボタンと「設定をロード」ボタンを追加したい。設定を保存すると、上記の方法で辞書がファイルに書き込まれ(ユーザーがCSVファイルを直接編集しやすくするため)、読み込み設定がファイルから読み込まれ、textctrlとチェックボックスが更新されます。

72
user1106770

DictWriterは期待どおりに機能しません。

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

読み返すには:

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

これは非常にコンパクトですが、読み取り時に型変換を行う必要がないことを前提としています

152

オプションを与えるために、辞書をcsvファイルに書き込むこともpandasパッケージを使用して行うことができます。指定された例では、次のようなものになります。

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 メソッド内で 'orient'パラメーターを 'index'に設定することです。これにより、各辞書キーを新しい行に書き込むかどうかを選択できます。

さらに、 to_csv メソッド内で、迷惑な行のない辞書要素のみを持つために、ヘッダーパラメーターはFalseに設定されます。 to_csvメソッド内で列名とインデックス名をいつでも設定できます。

出力は次のようになります。

key1,a
key2,b
key3,c

代わりにキーを列の名前にしたい場合は、ドキュメントのリンクで確認できるように、デフォルトの「columns」である「orient」パラメーターを使用します。

12
Ivan Calderon

最も簡単な方法は、csvモジュールを無視して自分でフォーマットすることです。

with open('my_file.csv', 'w') as f:
    [f.write('{0},{1}\n'.format(key, value)) for key, value in my_dict.items()]
12
Phil Horowitz
outfile = open( 'dict.txt', 'w' )
for key, value in sorted( mydict.items() ):
    outfile.write( str(key) + '\t' + str(value) + '\n' )
4
FCAlive

あなたはちょうどできますか:

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

あなたが持つことができるように

key_1:value_1、key_2:value_2

2
louis.luo

個人的にはcsvモジュールはいらいらするものでした。他の誰かがこれを巧みに行う方法をあなたに教えてくれると期待していますが、私の迅速で汚い解決策は次のとおりです:

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

ただし、読み直したい場合は、特にすべてが1行である場合、いらいらする解析を行う必要があります。提案されたファイル形式を使用した例を次に示します。

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
1
Griffith Rees
import csv

dict = {"Key Header":"Value Header", "key1":"value1", "key2":"value2"}

with open("test.csv", "w") as f:
    writer = csv.writer(f)
    for i in dict:
      writer.writerow([i, dict[i]])
f.close() 

enter image description here

0
Apurva Thorat

私はこのコメントに遅れていますが、笑リストでは、複数ではなく単数を使用していました。ポップス!修正されました。

0
Hikhuj