Писатель Python 2 CSV создает неверный ограничитель строк в Windows

В соответствии с его документацией 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:

ActivePython 2.6.2.2 (ActiveState Software Inc.) на основе Python 2.6.2 (r262: 71600, 21.04.2009, 15:05:37) [MSC v.1500 32 бит (Intel)] на win32

в Windows Vista​​p >

Ответ 1

В Python 2.x всегда открывайте файл в двоичном режиме, как описано. csv записывает \r\n, как вы ожидали, но тогда основной механизм текстовых файлов Windows разрезается и изменяется от \n до \r\n... total effect: \r\r\n

Из csv.writer документация:

Если csvfile является файловым объектом, он должен быть открыт с флагом 'b' на платформах, где это имеет значение.

Похоже, что существует некоторое недоверие к фактическому произнесению имени главного виновника: -)

Ответ 2

Чтобы изменить терминатор линии в Python 2.7 csv writer, используйте

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

Это гораздо более простой способ изменить разделитель по умолчанию из\r\n.

Ответ 3

К сожалению, это немного отличается от модуля csv для Python 3, но этот код будет работать как на Python 2, так и на Python 3:

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