web-dev-qa-db-ja.com

Python 2 Windowsで2 CSVライターが間違った行終端文字を生成する

そのドキュメント によれば、csv.writerはデフォルトで '\ r\n'をラインターミネータとして使用する必要があります。

import csv

with open("test.csv", "w") as f:
    writer = csv.writer(f)

    rows = [(0,1,2,3,4),
           (-0,-1,-2,-3,-4),
           ("a","b","c","d","e"),
           ("A","B","C","D","E")]           

    print writer.dialect.lineterminator.replace("\r", "\\r").replace("\n", "\\n")
    writer.writerows(rows)
    print writer.dialect.lineterminator.replace("\r", "\\r").replace("\n", "\\n")

これはプリント

\r\n
\r\n

予想通り。ただし、作成されたcsvファイルは行末記号 '\ r\r\n'を使用します

0,1,2,3,4

0,-1,-2,-3,-4

a,b,c,d,e

A,B,C,D,E

これはバグですか、csv.writerの使用に問題がありますか?

Pythonバージョン:

Python 2.6.2(r262:71600、Apr 21 2009、15:05:37)]に基づくActivePython 2.6.2.2(ActiveState Software Inc.)[MSC v.1500 32ビット(Intel) ] win32

windows Vistaの場合

43
wierob

Python 2.xでは、文書化されているように、常にbinaryモードでファイルを開きます。csv書き込み\r\n期待どおりですが、その後、基礎となるWindowsテキストファイルメカニズムが割り込み、変更します\nから\r\n ...合計効果:\r\r\n

から - csv.writer ドキュメント:

csvfileがファイルオブジェクトの場合は、'b'フラグが違いをもたらすプラットフォーム。

主な犯人の名前を実際に発声することについては、いくらか無口があるようです:-)

編集:この回答へのコメントで@jebobが言及し、@ Dave Burtonの answer に基づいて、Python 2と3の両方でこのケースを処理するには、以下をせよ:

if sys.version_info >= (3,0,0):
    f = open(filename, 'w', newline='')
else:
    f = open(filename, 'wb')
65
John Machin

残念ながら、Python 3のcsvモジュールとは少し異なりますが、このコードはPython 2とPython 3の両方で機能します。

if sys.version_info >= (3,0,0):
    f = open(filename, 'w', newline='')
else:
    f = open(filename, 'wb')
25
Dave Burton

Python 2.7 csv writerで行末記号を変更するには

writer = csv.writer(f, delimiter = '|', lineterminator='\n')

これは、デフォルトの区切り文字を\ r\nから変更する非常に簡単な方法です。

23
Jason Callahan