2016-10-19 5 views
0

ループ内の各行を追加し辞書を使用してCSVファイルに書きます。次のコードは次のとおりです。ループ内の辞書を使ってcsvの行を書く(Python 3)

fieldnames = ['id', 'variable1', 'variable2'] 
f = open('file.csv', 'w') 
my_writer = csv.DictWriter(f, fieldnames) 
my_writer.writeheader() 
f.close() 

for i in something: 

    something where I get data for mydict  

    with open('file.csv', 'a+b') as f: 
    header = next(csv.reader(f)) 
    dict_writer = csv.DictWriter(f, header) 
    dict_writer.writerow(mydict) 

私は、このコードは何年か前に私のために働いたと確信していたが、おそらく私はpython2を使用していました。今私はpython 3を使用しており、次のエラーが表示されます:

header = next(csv.reader(f)) 

StopIteration 

何が問題なのですか?おかげ

+1

:あなたは、Python 3を使用していることから、あなたがファイルをバイナリモードを使用すべきではありません。 [こちら](https://docs.python.org/3/library/csv.html#csv.reader)などを参照してください。 – DSM

+0

ファイルを一度作成して何度も何度も使用するのではなく、ファイルを再オープン/リラップしているのはなぜですか?ヘッダーは、すべての行で変更されるべきではありません。たとえそれがあったとしても、再ラッピングするだけで、何度も繰り返して貼り付けるよりも理にかなっています。 – ShadowRanger

答えて

0

私のソリューションでした:別に

fieldnames = ['id', 'variable1', 'variable2'] 

f= open('file.csv', 'w', newline='') 
my_writer = csv.DictWriter(f, fieldnames) 
my_writer.writeheader() 

for i in something: 

    something where I get data for mydict 

    writer.writerow(mydict) 

f.close() 
+2

ここでは、デザインがあまり意味がありません。あなたのフィールド名は変わりません。 _once_ファイルを開き、 'DictWriter' _once_でラップして、すべての処理を行います。ファイルを繰り返し開いたり閉じたりして、新しく 'DictWriter'で繰り返しラッピングする方がはるかに効率的です。すべての文章をカバーする 'with'ブロックを用意しておき、ループが終了すると自動的に閉じます。 – ShadowRanger

+0

同じループ内で別のCSVファイルを別に作成していますが、一度開いてすべての処理を行うと問題はありますか? – user2246905

+0

複数のファイルを同時に開くことができます。同じファイルを書き込むために2つのファイルハンドルを開いている(問題の原因となるのは、読み取り用に1つ、書き込み用に1つのみである可能性があります)場合にのみ問題が発生します。しかし、一度に2つの異なるファイルを開くことは全く問題ありません。 – ShadowRanger