2010-11-22 24 views
9

Pythonを使用してCSVファイルを追加すると、他のすべての行でデータが取得されます。 修正方法このようなルックス開けCSVファイルに追加するにはどうすればよいですか?

import csv 

LL = [(1,2),(3,4)] 

Fn = ("C:\Test.csv") 
w = csv.writer(open(Fn,'a'), dialect='excel') 
w.writerows(LL) 

C:\test.csv

1,2 

3,4 

1,2 

3,4 
+0

質問/問題は何ですか? – poke

+0

「1行おきにデータを取得していますが、どうすれば修正できますか?」これは正確にはどういう意味ですか?サンプル出力と希望のサンプル出力をペーストできますか? – Chris

+2

@poke、@Chris:期待される各データ行の後にOPが予期しない空の行を挿入しています。 –

答えて

34

追加が問題とは無関係です。最初の2つの行(元のファイルからの行)も2つの空白になっていることに注意してください。

実際の問題は、のテキストモードでファイルを開いたことです。

CSVはバイナリ形式です。 csvモジュールは誤解を招くような名前の "lineterminator"(rowseparatorである必要があります)を期待どおりに\r\nと書いていますが、Windows Cランタイムが起動し、を\r\nに置き換えて、行間に\r\r\nがあるようにします。 CSVファイルをExcelで混乱させます

Windowsで動作しているかどうかにかかわらず、バイナリモード( 'rb'、 'wb'、 'ab')で常にCSVファイルを開きます。 * xボックスでもrowseparator(CR LF)を使用すると、コードは移植性があり、データに埋め込まれた改行は何か他のものに変更されたり、ドラマを引き起こしたりすることはありません適切に)

オース

(1)ルートディレクトリ(C:\)にデータを入れないでください。 Windowsは1980年代にMS-DOSから階層ファイルシステムを継承しました。これを使って。

(2)コードにハードワイヤードのファイル名を埋め込む必要がある場合は、生の文字列r"c:\test.csv"を使用してください。"c:\test.csv"がある場合、 '\ t'はTAB文字として解釈されます。 \r\n

(3)のような問題もあります。Pythonマニュアルの例は、堅牢なコードよりも簡潔になります。

はこれをしないでください。

w = csv.writer(open('foo.csv', 'wb')) 

はこれを行います。

f = open('foo.csv', 'wb') 
w = csv.writer(f) 

を次に終了したら、あなたは利用可能fを持っているあなたは、ファイルの内容があることを確認するためにf.close()を行うことができますようにディスクにフラッシュされます。さらに新しい:withステートメントで読んでください。

+0

ダーン。私はちょうどこれを理解し、同じことを言っている答えの途中でした。 +1。 –

+0

+1;完全な答えと徹底した説明が必要です。 – bernie

+0

興味深いことに、Python 2のドキュメントの 'csv'ドキュメントのほとんどの例はバイナリモードを使用していますが、['DictReader'](https://docs.python.org/2/library/csv.html#csv.DictReader )の例では、[Python 3の例はありません](https://docs.python.org/3/library/csv.html)もありません。これには正当な理由はありますか?そうでない場合は、おそらくあなたはドキュメントを変更しようとしたいですか? –

2

Windowsで実行中に、既に作成されたcsvファイルを追加する際に同様の問題が発生しました。

この場合、「バイナリ」モードでの書き込みと追加は、pythonスクリプトを使用して書いたり追加した各行に余分な行を追加することを避けます。したがって、

w = csv.writer(open(Fn,'ab'),dialect='excel') 
+0

ウィンドウでは、Pythonで防御的なコーディングをしなければなりません... – Merlin

関連する問題