web-dev-qa-db-ja.com

PythonでDictwriterを使用して出力すると、CSVファイルに各データ行の間に空白行が含まれるのはなぜですか

DictWriterを使用して、辞書のデータをcsvファイルに出力しています。 CSVファイルの各データ行の間に空白行があるのはなぜですか?大したことではありませんが、私のデータセットは大きく、 "double-spacing"によってファイルの行数が2倍になるので行が多すぎるため、1つのcsvファイルに収まりません。

辞書に書き込むための私のコードは次のとおりです。

headers=['id', 'year', 'activity', 'lineitem', 'datum']
output = csv.DictWriter(open('file3.csv','w'), delimiter=',', fieldnames=headers)
output.writerow(dict((fn,fn) for fn in headers))
for row in rows:
    output.writerow(row)
87
myname

デフォルトでは、csvモジュールのクラスは、Unixスタイル(\r\n)ではなく、Windowsスタイルの行終端記号(\n)を使用します。これが明らかに二重改行を引き起こしている可能性がありますか?

その場合は、DictWriterコンストラクターでオーバーライドできます。

output = csv.DictWriter(open('file3.csv','w'), delimiter=',', lineterminator='\n', fieldnames=headers)
120
FatBusinessman

http://docs.python.org/library/csv.html#csv.writer から:

Csvfileがファイルオブジェクトの場合、違いが生じるプラットフォームでは「b」フラグを付けて開く必要があります。

つまり、ファイルを開くときに、「w」ではなく「wb」を渡します。
ファイルへの書き込みが完了したら、withステートメントを使用してファイルを閉じることもできます。
以下のテスト例:

from __future__ import with_statement # not necessary in newer versions
import csv
headers=['id', 'year', 'activity', 'lineitem', 'datum']
with open('file3.csv','wb') as fou: # note: 'wb' instead of 'w'
    output = csv.DictWriter(fou,delimiter=',',fieldnames=headers)
    output.writerow(dict((fn,fn) for fn in headers))
    output.writerows(rows)
30
bernie

この行の「w」(書き込み)を変更します。

output = csv.DictWriter(open('file3.csv','w'), delimiter=',', fieldnames=headers)

'wb'(バイナリを書き込む)でこの問題を修正しました:

output = csv.DictWriter(open('file3.csv','wb'), delimiter=',', fieldnames=headers)

Python v2.75:Open()

上記の元の投稿のコメントにあるソリューションの@dandrejvvの功績です。

10
James Nicholson

私はあなたのスニペットをテストしましたが、ここには二重のスペースはありません。行末は\r\nであるため、あなたのケースでチェックするのは次のとおりです。

  1. エディターはDOSファイルを正しく読み取っています
  2. 行ディクショナリの値に\ nは存在しません。

(値に\ nを付けても、DictWriterは自動的に値を引用することに注意してください。)

0
tito