2016-06-17 4 views
1

あるリストには値が1つしかなく、他のリストには多くのリストが含まれるリストの辞書があります。このコードを使用してPython:異なるインデックスの辞書リストをCSVファイルに書き込む

は、私が意図した出力を得る:

多少のようになります
import csv 
    from collections import OrderedDict 

    my_dict = OrderedDict() 
    my_dict["Header1"] = [1,2,3] 
    my_dict["Header2"] = [4,5,6] 

    #if file doesn't exist... 
    with open('mycsv.csv', 'wb') as f: 
     w = csv.writer(f, delimiter=';') 
     w.writerow(my_dict.keys()) 
    with open('mycsv.csv', 'ab') as f: 
     w = csv.writer(f, delimiter=';') 
     w.writerows(zip(*my_dict.values())) 

ヘッダ1、ヘッダ2

1; 4

2; 5

3; 6

ヘッダ2

1; 4

ヘッダ1:私はこの種のリストの辞書を持っている場合

しかし、私の場合には、:

my_dict["Header1"] = [1,2,3] 
    my_dict["Header2"] = [4] 

私のような出力を得ます私は持っているつもりだった:

ヘッダー1;ヘッダー2

1; 4

2;

3;

これを解決する方法の提案はありますか?

ありがとうございます(申し訳ありませんが、何か悪いスレッドの書式設定については、私の最初の質問です:P)!

+0

['itertools.izip_longest'](https://docs.python.org/2/library/itertools.html#itertools.izip_longest)を調べましたか? 'zip'は全ての引数を最短の長さに切り捨てます。 – jonrsharpe

+0

'izip_longest'を' '' 'のfillvalueで使うことができます。' csv.DictWriter'を見て自動的にヘッダを扱い、ファイルを2回開くのを避けることもできます。 –

+0

@jonrsharpeは私と同じように働きました必要、ありがとう! @JonClements最初のファイルが開く前に '(if(os.path.isfile(...)== False):(...))'を使用していますので、すでに存在していませんでしたが、私はそれを調べます、ありがとう! –

答えて

1

zipの代わりにmap(lambda *x: tuple(x), *my_dict.values())を使用できます。空の要素をNoneに置き換えるか、itertools.izip_longest(*my_dict.values())を使用します。 csvは自動的にNoneの値を空のままにします。

関連する問題