'key:value'ごとに1行の辞書をcsvファイルに書き込む


91

私は辞書を持っています:

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つの行にあり、すべての値が次の行にあります。

このようなファイルを書くことができたら、それを新しい辞書に読み戻したいと思います。

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


1
出力として必要なもののより良い例を提供できますか?上記の「スタイル」はCSVではありません。お探しkey1, value_a [linebreak] key2, value_b [linebreak] key3, value_cですか?
tkone 2011

別のアプローチは、使用することですrepr()うちのdictを書き、その後、あなたはそれを読んで文字列をevalする。これを見て、古いSOポストの議論のためのstr()repr()、およびドキュメント、あまりにも。
Peter Rowell 2011

別にあなただけのプレーンなCSVファイルよりも、もう少し洗練されたものを、好むかどうかをチェックしたい場合、下記の私の答えからConfigParserモジュールを
リカルドCárdenes

3
あなたが説明するのは、csvモジュールによって書き出される典型的なCSV形式です。あなたは、同じキーで複数のdictsを書き出す場合は、キーはライン1のキーと整列するために適切な順序で、対応する値のためのdictごとに1行で、最初の行では、一度だけ書かれている
PaulMcG

回答:


185

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)

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


2
うーん... CSVに正確に似ていない特定の形式が必要なことに気づきました。...あなたは、CSVモジュールを使用していたので、あなたはCSV形式(。キーと値のペアごとに、すなわち行)を望んでいたことを想定
リカルドCárdenes

3
それとも...場合のCSVのアプローチは、あなたが何を望むかを正確ですが、あなたは好む「:」セパレータとして、単に追加delimiter=':'作家と読者:)作成するとき
リカルドCárdenesを

2
書き込みと読み取りの間にファイルを閉じる必要があることに注意してください。この質問/回答で何が起こったのかをご覧ください:stackoverflow.com/a/38467563/235698
Mark Tolonen 2016

1
@MarkTolonen確かに、使用withする方が良いでしょう。私は...それを反映して例を変更します
リカルドCárdenes

1
@DareYang遅れてすみません。実は、なぜ当時書いたのかわかりません。必要ありません。書き込むとき、これの効果は、改行文字を翻訳しないままにすることです(つまり\n、書くと\n、ファイルに入れられます)。そのままにしておくと、「ユニバーサルモード」が開始され、改行が現在のオペレーティングシステムのデフォルトに変換されます。ここではあまり役に立たないので(予測可能な改行が必要な場合を除いて)、削除します。
リカルドカルデネス

27

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

さらに、to_csvメソッド内では、ヘッダーパラメーターがFalseに設定されており、煩わしい行を含まない辞書要素のみが含まれています。to_csvメソッド内でいつでも列名とインデックス名を設定できます。

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

key1,a
key2,b
key3,c

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


2
優れた魅力のように働いた:)。私の値はリストであり、複数のセルにすべてのリスト値を含むcsvが生成され、最初の列のキーにマップされました。
vinsinraw

14

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

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

8
あなたkeyがコンマを取得した場合、あなたは悪い時間を過ごすことになります。
Ali Ashraf

5
を使用する方が簡単だと思いますcsv.writer(...).writerows(my_dict.items())。このcsvモジュールは、コンマと改行を追加するだけではありません。
MartijnPieters

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

1
また、あなたの答えについていくつかの情報やコメントを提供してください。
NDM 2013

2

あなたはただすることができます:

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

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

key_1:value_1、key_2:value_2


3
ベターだろう','.join("%s:%s" % (k,v) for k,v in mydict.items())-あなたは辞書のキーとやって「n」の値のルックアップオーバーよりも、一緒にあなたのキーと値を与えるのdictの項目、上で通常より良い反復オフになっています。','.join(...)余分な末尾のコンマを追加せずに、値の間にコンマを置くだけで処理します。
PaulMcG 2011

あなたはこのPythonのコードのために最後にセミコロンを必要としないことに注意してください
beep_check

1

個人的には、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

私はリカルドの答えに行きます。または、少なくとも別の行を使用します。
グリフィスリース2011

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

ここに画像の説明を入力してください


最後の行のファイルを明示的に閉じる必要はないと思います。コンテキストマネージャーがそれを行います。
avaj_wen12

0
#code to insert and read dictionary element from csv file
import csv
n=input("Enter I to insert or S to read : ")
if n=="I":
    m=int(input("Enter the number of data you want to insert: "))
    mydict={}
    list=[]
    for i in range(m):
        keys=int(input("Enter id :"))
        list.append(keys)
        values=input("Enter Name :")
        mydict[keys]=values

    with open('File1.csv',"w") as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=list)
        writer.writeheader()
        writer.writerow(mydict)
        print("Data Inserted")
else:
    keys=input("Enter Id to Search :")
    Id=str(keys)
    with open('File1.csv',"r") as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            print(row[Id]) #print(row) to display all data

あなたは少し説明追加した場合、それは良いだろう
Roaim

-2

次のw.writerow(mydict)ように「s」を追加しようとしましたw.writerows(mydict)か?この問題は私に起こりましたが、リストでは、複数形ではなく単数形を使用していました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.