Как написать символы конца строки Unix в Windows?

80

Как я могу писать в файлы с помощью Python (в Windows) и использовать символ конца строки Unix?

например, при выполнении:

f = open ('file.txt', 'ш')
f.write ('привет \ п')
f.close ()

Python автоматически заменяется \nна \r\n.

tttppp
источник

Ответы:

65

Для Python 2 и 3

См .: Современный способ: используйте ответ newline = '' именно на этой странице.

Только для Python 2 (исходный ответ)

Откройте файл как двоичный, чтобы предотвратить перевод символов конца строки:

f = open('file.txt', 'wb')

Цитата из руководства Python:

В Windows добавление «b» к режиму открывает файл в двоичном режиме, поэтому существуют также такие режимы, как «rb», «wb» и «r + b». Python в Windows делает различие между текстовыми и двоичными файлами; символы конца строки в текстовых файлах автоматически слегка изменяются при чтении или записи данных. Эта закулисная модификация файловых данных хороша для текстовых файлов ASCII, но повредит двоичные данные, как в файлах JPEG или EXE. Будьте очень осторожны при чтении и записи таких файлов в двоичном режиме. В Unix не помешает добавить к режиму букву «b», так что вы можете использовать его независимо от платформы для всех двоичных файлов.

Тамаш
источник
96

Современный способ: используйте новую строку = ''

Используйте newline=параметр ключевого слова для io.open (), чтобы использовать терминаторы конца строки LF в стиле Unix:

import io
f = io.open('file.txt', 'w', newline='\n')

Это работает в Python 2.6+. В Python 3 вы также можете использовать параметр встроенной open()функции newline=вместо io.open().

Старый способ: двоичный режим

Старый способ предотвратить преобразование новой строки, который не работает в Python 3, - это открыть файл в двоичном режиме, чтобы предотвратить перевод символов конца строки:

f = open('file.txt', 'wb')    # note the 'b' meaning binary

но в Python 3 двоичный режим будет читать байты, а не символы, поэтому он не будет делать то, что вы хотите. Вы, вероятно, получите исключения, когда попытаетесь выполнить строковый ввод-вывод в потоке. (например, «TypeError: 'str' не поддерживает интерфейс буфера»).

Колин Д. Беннетт
источник
1
Это поможет мне, используя следующее: # newline = '' означает не конвертировать \ n plus.google.com/+PongsametreySOK/posts/2Bg8AdNJCxV
Osify
Вы можете установить новую строку как '\n'direct, это более явно, чем '', и я думаю, что это легче читать.
12431234123412341234123
1
@ 12431234123412341234123 Согласен, использование '\n'понятнее, чем ''. Тогда мне не понадобятся комментарии, чтобы объяснить, что делает код :) Но имейте в виду, что это верно только для записи файлов. При чтении файлов newline='\n'это не совсем то же самое, что и newline='', поскольку readlines()разделение происходит только \nв первом случае, но при newline=''этом будет выполняться универсальная обработка новой строки, но все равно будут возвращаться фактические новые строки из файла в данных. Спасибо за предложение! Программа тестирования Python
Колин Д. Беннетт
Python 3.6+ (возможно, и предыдущие версии Python3). Если вы немного беспокоитесь о том, '\n'что увидите то же самое, что было переключено ранее, вы можете использовать кодировку Unicode (убедитесь, что кодировка - utf-8 или что-то еще совместимое). with open('file.txt', 'w', encoding='utf-8', newline='\u000A'); PS результат ничем не отличается от newline='\n'версии, просто если кому-то нужно больше комфорта.
bballdave025
9

Вам нужно будет использовать двоичный псевдо-режим при открытии файла.

f = open('file.txt', 'wb')
Джонатан Файнберг
источник