5

正しくフォーマットされた、Excelで開くことができるようにしたい辞書のリストがあります。これは私がこれまでに持っているもので、csvを使用しています:

list_of_dicts = [{'hello': 'goodbye'}, {'yes': 'no'}]
out_path= "/docs/outfile.txt"
out_file = open(ipath, 'wb')

writer = csv.writer(ofile, dialect = 'excel')

for items in list_of_dicts:
    for k,v in items.items():
        writer.writerow([k,v])

明らかに、Excelで出力を開くと、次のようにフォーマットされています。

key  value
key  value

私が欲しいのはこれです:

key   key   key

value value value

これを行う方法がわからないので、助けていただければ幸いです。また、デフォルトの「A、B、C」などではなく、列名を辞書キーにします。これがばかげている場合は申し訳ありません。

ありがとう

4

3 に答える 3

6

csvモジュールにはこのためのDictWriterクラスがあり、これは別のSO回答で非常にうまくカバーされています。重要な点は、DictWriterをインスタンス化するときに、すべての列見出しを知る必要があるということです。list_of_dictsからフィールド名のリストを作成できます。その場合、コードは次のようになります。

list_of_dicts = [{'hello': 'goodbye'}, {'yes': 'no'}]
out_path= "/docs/outfile.txt"
out_file = open(out_path, 'wb')

fieldnames = sorted(list(set(k for d in list_of_dicts for k in d)))
writer = csv.DictWriter(out_file, fieldnames=fieldnames, dialect='excel')

writer.writeheader() # Assumes Python >= 2.7
for row in list_of_dicts:
    writer.writerow(row)
out_file.close()

フィールド名を作成した方法では全体がスキャンlist_of_dictsされるため、サイズが大きくなると速度が低下します。代わりに、データのソースから直接構築する必要fieldnamesがあります。たとえば、データのソースがcsvファイルでもある場合は、DictReaderを使用してを使用できますfieldnames = reader.fieldnames

forループを1回の呼び出しに置き換え、ブロックをwriter.writerows(list_of_dicts)使用してwithファイルのクロージャーを処理することもできます。その場合、コードは次のようになります。

list_of_dicts = [{'hello': 'goodbye'}, {'yes': 'no'}]
out_path= "/docs/outfile.txt"

fieldnames = sorted(list(set(k for d in list_of_dicts for k in d)))

with open(out_path, 'wb') as out_file:
    writer = csv.DictWriter(out_file, fieldnames=fieldnames, dialect='excel')
    writer.writeheader()
    writer.writerows(list_of_dicts)
于 2012-12-01T15:14:18.483 に答える
2

代わりに、2つの別々の行を記述する必要があります。1つはキーを使用し、もう1つは値を使用します。

writer = csv.writer(ofile, dialect = 'excel')

writer.writerow([k for d in list_of_dicts k in d])
writer.writerow([v for d in list_of_dicts v in d.itervalues()])

2つのリスト内包表記は、最初にすべてのキーを抽出し、次にすべての値を入力リストの辞書から抽出し、これらを1つのリストに結合してCSVファイルに書き込みます。

于 2012-12-01T14:21:04.447 に答える
0

最も便利なのは列ごとに書くことだと思うので、各キーは列です(後でデータ処理やMLなどに使用するのに適しています)。

昨日それを理解するのに苦労しましたが、他のウェブサイトで見た解決策を思いつきました。しかし、私が見たところ、辞書全体を一度に調べることは不可能であり、それをより小さな辞書に分割する必要があります(私のcsvファイルは最後に2万行ありました-調査対象者、彼らのデータと回答。私はそれを好きでしたこれ:

    # writing dict to csv
    # 'cleaned' is a name of the output file 
    
    # 1 header 
    # fildnames is going to be columns names 
    
    # 2 create writer 
    writer = csv.DictWriter(cleaned, d.keys())
    
    # 3 attach header 
    writer.writeheader()
    
    # write separate dictionarties 
    for i in range(len(list(d.values())[0])):
        
        writer.writerow({key:d[key][i] for key in d.keys()}) 

私のソリューションにはもう1つのforループがあるようですが、一方で、必要なメモリは少ないと思います(ただし、わかりません!!)誰かに役立つことを願っています;)

于 2020-09-01T15:52:56.623 に答える