Обработка \ r \ n vs \ n новых строк в python на Mac против Windows - PullRequest
32 голосов
/ 05 января 2011

У меня есть скрипт на python, который выдает разные результаты при запуске на компьютере с Windows и при запуске на Mac. Углубившись вглубь, я обнаружил, что это потому, что когда Python читает на Mac разрывы строк (из файла), он читает в \r\n, а в Windows каким-то образом \r исчезает.

Таким образом, если я изменю каждый \n в скрипте на \r\n, он отлично работает на Mac. Но если я это сделаю, он перестанет работать на ПК с Windows.

Есть ли простой способ решить эту проблему?

Ответы [ 5 ]

37 голосов
/ 05 января 2011

Разные платформы имеют разные коды для "новой линии". В Windows есть \ r \ n, в Unix есть \ n, в старых маках есть \ r, и да, в некоторых системах есть \ n \ r.

Когда вы открываете файл в текстовом режиме в Python 3, он преобразует все новые строки в '\ n' и с этим покончено.

infile = open("filename", 'r')

Текстовый режим по умолчанию, поэтому, если вы ничего не говорите, это текстовый режим. Но всегда лучше быть точным:

infile = open("filename", 'rt')

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

infile = open("filename", 'rb')

В Python 2 все по-другому. Там это преобразование будет происходить только по умолчанию в Windows. Если вы хотите, чтобы это происходило на других платформах, вы можете добавить универсальный флаг перевода строки:

infile = open("filename", 'rU')

Однако вы говорите, что находитесь на Python 3, и там это происходит в текстовом режиме на всех платформах, поэтому добавление флага U не должно иметь никакого значения.

21 голосов
/ 05 января 2011

Полагаю, это может зависеть от того, из чего вы читаете, но встроенная функция open () принимает параметр 'mode', и если вы передадите 'U' для режима, Python позаботится о переводе строки кроссплатформенным способом прозрачно. Требуется, чтобы Python был собран с универсальной поддержкой новой строки, но протестируйте его!

http://docs.python.org/library/functions.html#open

5 голосов
/ 10 июля 2013

В Python 3 используйте ключевое слово аргумент "newline = '\ n'" в open (), чтобы использовать указанный разделитель строк при записи текстовых файлов. Для получения дополнительной информации, пожалуйста, смотрите:

https://pythonconquerstheuniverse.wordpress.com/2011/05/08/newline-conversion-in-python-3/

http://docs.python.org/3/library/functions.html#open

0 голосов
/ 08 декабря 2018

В Python 3 метод Open() имеет параметр newline:

newline управляет работой универсального режима перевода строки (он применяется только к текстовому режиму).Это может быть None, '', '\ n', '\ r' и '\ r \ n'.Он работает следующим образом:

При чтении ввода из потока, если символ новой строки равен None, включается режим универсальных строк новой строки.Строки на входе могут оканчиваться на «\ n», «\ r» или «\ r \ n», и они переводятся в «\ n» перед возвратом вызывающей стороне.Если это '', включается универсальный режим перевода строки, но окончания строки возвращаются вызывающей стороне без перевода.Если он имеет любое из других допустимых значений, входные строки заканчиваются только данной строкой, а окончание строки возвращается вызывающей стороне без перевода.

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

Старый способ использования спецификатора режима U устарел в пользу этогоновый способ.

Универсальный режим новой строки 'U' (устарел)

0 голосов
/ 24 марта 2018

На окнах они оба работают нормально, если я пытаюсь написать файл с любым из двух (\ r или \ n), питон интерпретирует его как разрыв строки в обоих случаях.При использовании «\ r \ n» это интерпретируется как разрыв строки (Python 3 в windows)

...