Python file.write, создающий дополнительный возврат каретки - PullRequest
14 голосов
/ 26 октября 2010

Я пишу серию операторов SQL в файл, используя python. Строка шаблона выглядит так:

store_insert = '\tinsert stores (storenum, ...) values (\'%s\', ...)'

Я пишу в файл так:

for line in source:
    line = line.rstrip()
    fields = line.split('\t')
    script.write(store_insert % tuple(fields))
    script.write(os.linesep)

Однако в полученном результате я вижу \ r \ r \ n в конце каждой строки, а не \ r \ n, как я ожидал. Почему?

Ответы [ 5 ]

27 голосов
/ 26 октября 2010

\n преобразуется в os.linesep для файлов, открытых в текстовом режиме. Поэтому, когда вы пишете os.linesep в файл текстового режима в Windows, вы пишете \r\n, и \n конвертируется, что приводит к \r\r\n.

См. Также Документы :

Не используйте os.linesep в качестве ограничителя строки при записи файлов, открытых в текстовом режиме (по умолчанию); вместо этого используйте один \ n на всех платформах.

7 голосов
/ 20 декабря 2016

с питоном 3

os.open() вводит новый параметр newline, который позволяет указать строку, в которую будет преобразовано любое вхождение \n.

Передача аргумента пустой строки newline='' отключает перевод, оставляя символ новой строки без изменений. Действительно только для текстового режима.

Из документации

На выходе, если символ новой строки равен None, любые написанные символы '\ n' переводится в системный разделитель строк по умолчанию, os.linesep. Если перевод строки '', перевод не выполняется. Если перевод строки является одним из другие допустимые значения, любые написанные символы \ n переводятся в заданная строка.

3 голосов
/ 26 октября 2010

Текстовые файлы имеют разные окончания строк в разных операционных системах, но удобно работать со строками, которые имеют согласованный символ окончания строки. Python наследует от C соглашение об использовании '\n' в качестве универсального символа окончания строки и использовании функций чтения и записи файла для выполнения преобразования, если это необходимо. Функции чтения и записи знают, что делать это, если файл был открыт в режиме text по умолчанию. Если вы добавите символ b в строку режима при открытии файла, этот перевод будет пропущен.

1 голос
/ 26 октября 2010

работает для меня:

>>> import tempfile
>>> tmp = tempfile.TemporaryFile(mode="w+")
>>> store_insert = '\tinsert stores (storenum, ...) values (\'%s\', ...)'
>>> lines = ["foo\t\t"]
>>> for line in lines:
...     line = line.rstrip()
...     fields = line.split("\t")
...     tmp.write(store_insert % tuple(fields))
...     tmp.write(os.linesep)
...
>>> tmp.seek(0)
>>> tmp.read()
"\tinsert stores (storenum, ...) values ('foo', ...)\r\n"

Вы уверены, что это код, который работает, что os.linesep это то, что вы думаете, и т. Д.?

1 голос
/ 26 октября 2010

см. открытый () документ:

В дополнение к стандартным значениям fopen () режим может быть «U» или «rU». Python обычно создается с универсальной поддержкой новой строки; при вводе 'U' файл открывается как текстовый файл, но строки могут заканчиваться любым из следующих условий: соглашение о конце строки Unix '\ n', соглашение Macintosh '\ r' или соглашение Windows '\ г \ п». Все эти внешние представления рассматриваются как '\ n' программой Python. Если Python построен без поддержки универсальной новой строки, режим с 'U' такой же, как и в обычном текстовом режиме. Обратите внимание, что у файловых объектов, открытых таким образом, также есть атрибут, называемый символом новой строки, который имеет значение None (если новых строк еще не замечено), '\ n', '\ r', '\ r \ n' или кортеж, содержащий все Видимые символы новой строки.

...