2009-07-23 6 views
36

its documentationによれば、csv.writerはデフォルトでリテネレーターとして '\ r \ n'を使用する必要があります。予想通りPython 2 CSVライターがWindows上で間違った行終端文字を生成する

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ファイルには、lineterminatorを使用しています「\ 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のバージョン:

のActivePython 2.6.2.2(ActiveStateの Software社)のPython 2.6.2 に基づいて(r262:71600、2009年4月21日、夜03時05分37秒) [MSC V文書化されているようにWindows VistaでのWin32

上の0.1500 32ビット(インテル)]

+0

$ file test.csv test.csv:CRLF行ターミネータ付きのASCIIテキスト –

+1

@lutz:$ promptは、* xは、テキスト間の違い(Python 2.x)を意味しません。モードとバイナリモード。 OPはWindowsを実行しています。 –

+2

@wierob:.replace(...)を失う。組み込みのrepr()を使用する。 –

答えて

60

は、Python 2.xでは、常に、バイナリモードでファイルを開きます。 たcsvfileがある場合

csv.writerドキュメントから\r\r\n

csvあなたが期待通り\r\nを書き込みますが、その後基礎となる、Windowsのテキストファイル機構の削減と変化\r\nから\n ...総効果ということファイルオブジェクトの場合は、違いが生じるプラットフォームでは'b'フラグで開かなければなりません。

実際残念ながら、それは、Python 3用のcsvモジュールと少し違うのですが、このコードは、両方のPythonで動作します

+0

うまくいくと思われます。これが文書化されている場所を教えてください。 – wierob

+6

良い "機能"は、Linuxなど、重要ではないプラットフォーム上ではバイナリモードでもオープンできるということです。バイナリモードを常に使用します。 – Arafangion

+2

3。6の場合、ドキュメントは '' csvfileがファイルオブジェクトであれば、それはnewline = '' '' – jebob

15

:-)主犯の名前を発声に関するいくつかの沈黙があるようです2とPython 3:

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

WindowsとLinuxの両方でPython 2と3の両方で動作する唯一のソリューションであり、プラットフォームに関係なく '\ r \ n'のCSV標準に準拠するファイルを生成します。 – MestreLion

19

は、Python 2.7 CSVライター使用中のラインターミネータを変更するには

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

デフォルトの区切り文字を\ r \ nから変更する方がはるかに簡単です。

+0

これは3.4でも私のために働く – Terrabits

+0

それは動作し、簡単です!私はstdoutにDictWriterを使用しています---上記のソリューションは本当に適切ではない、または余分なオーバーヘッドを追加します。 – ripvlan

+0

関連:https://stackoverflow.com/a/39379062/95852 –

関連する問題