2011-11-30 25 views
20

CSVをPython辞書に読み込むためのコードを記述しましたが、これはうまくいきます。私は辞書をCSVに戻そうとしています。私は次のように書いています:CSVへのPython辞書

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はaを出力しますが、CSVには何も書き込まれません。私はこれは辞書が順序付けられていないことと関係があると信じています。私は本当に各fID(fClassRange ex。 "5.0 to 5.25")に関連付けられたfIDとそれぞれのキーを書き出し、次に各fClassRangeに関連付けられた値fAreaをCSVに書き出す必要がありますが、私のコードは、私がfIDでも書き出す方法を理解することができないからです。

私はDictWriterを使用しましたが、必要な文字列がどのように表示されるかわかりません。

+0

はケネスReitz氏の[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 
) 

をまたは、あなたはちょうどあなたがフィールドをすることになっているものを知っていればfieldnames=['arbitrary','list','of','keys']するfieldnamesを設定することができます。

後世のために
+0

うわー、ありがとう!しかし、今私はこのメッセージを得ています:ValueError:dictはフィールド名にないフィールドを含んでいます:4,6,3,3,9 – bojo

+0

@bojoおっと!あなたはdictsのdictを作っています。正しいフィールド名を取得するには、*内部辞書*フィールド名が必要です。また、各辞書には同じフィールド名が必要です。それ以外の場合は、不正なフィールド名にDictWriterオプションを使用する必要があります。私はフィールド名を取得するための正しい辞書を使用するように行を更新しました。 –

+0

すみません、スペンサー、私はまだ同じValueErrorメッセージを受け取っています。 – bojo

1

:あなたは最後の部分は

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

になるようにこれは、私が使用するもので、そのシンプルで私のために正常に動作し、辞書を反復処理するために)(iteritemsを使用する必要があります

。あなたが唯一の辞書を持っているときに、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

ワンライナーパンダを使用して、CSVにdictsのリストを変換する:

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