そのドキュメント によれば、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の場合
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')
残念ながら、Python 3のcsvモジュールとは少し異なりますが、このコードはPython 2とPython 3の両方で機能します。
if sys.version_info >= (3,0,0):
f = open(filename, 'w', newline='')
else:
f = open(filename, 'wb')
Python 2.7 csv writerで行末記号を変更するには
writer = csv.writer(f, delimiter = '|', lineterminator='\n')
これは、デフォルトの区切り文字を\ r\nから変更する非常に簡単な方法です。