Писатель 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 Vistap >
Ответы
Ответ 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')