2010-10-26 3 views
9

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

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 \ n, как я ожидал. Зачем?

+1

Форматирование строки '%' теперь старое; предпочтительной идиомой является 'str.format' =) – katrielalex

+4

Вы открыли файл в текстовом или двоичном режиме? Какую ОС вы используете? – AndiDog

+0

Windows, и я просто сделал open (файл, 'r') – Chris

ответ

20

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

Смотрите также the docs:

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

+0

+1 хорошо найден! Это на самом деле не для меня (Win7), может быть, это зависящая от Windows вещь? – katrielalex

+0

Я также использую Windows 7, но это объясняет это. +1 и ответьте! – Chris

0

увидеть open() Doc:

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

+0

И что? Универсальный режим новой строки предназначен только для чтения. – AndiDog

+0

@ AndiDog: Я думаю, что он говорит, что когда он открывает файл с открытым ('', 'r') после того, как он написал на нем, он видит \ r \ r \ n, и он считает, что он написал только " \ r \ n '(windows), поэтому я сказал ему, что когда он откроет свой файл open(), он автоматически добавит свои данные к своим данным, поэтому' \ r \ n '+' \ r \ n '=' \ r \ r \ n ', удаляется' \ n ', вы хотите, чтобы я больше разбирался ??? – mouad

+1

Нет Я фактически использую отдельный выходной файл, открытый с открытым (файл, 'w'). Изменение для открытия (файл, «wb») устранило проблему, но я не совсем уверен, что понимаю, почему – Chris

1

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

>>> 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 является то, что вы думаете, и т.д.?

3

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

3

С Python 3

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

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

From the documentation

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

+0

Для примера использования и некоторой разработки см. [Здесь] (http://stackoverflow.com/questions/43528959/python-3-how-to-pass-binary-file-as-text-without-saving-first) – RolfBly