Python 2 CSV writer производит неправильный Терминатор строки в Windows


Согласно его документации csv.писатель должен использовать '\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-файл использует 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.писатель?

Версия Python:

ActivePython 2.6.2.2 (ActiveState Программного Обеспечения Инк.) на основе Python 2.6.2 (r262: 71600, 21 апреля 2009, 15: 05: 37) [MSC V. 1500 32 бит (Intel)] на win32

В Windows Vista

3   39   2009-07-23 11:34:11

3 ответа:

В Python 2.x, всегда открывайте файл в двоичном режиме , как описано в документации. csv пишет \r\n, Как вы и ожидали, но затем основной механизм текстовых файлов Windows вмешивается и изменяет этот \n на \r\n... общий эффект: \r\r\n

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

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

Кажется, есть некоторая скрытность в отношении фактически произнося имя главного виновника : -)

Edit: Как упоминалось @jebob в комментариях к этому ответу и на основе ответа @Dave Burton , чтобы обработать этот случай в Python 2 и 3, Вы должны сделать следующее:

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

К сожалению, это немного отличается от csv-модуля для Python 3, но этот код будет работать как на 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.