Подтвердить что ты не робот

Обработка\r\n vs\n новых строк в python на Mac и Windows

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Различные платформы имеют разные коды для "новой строки". У Windows есть \r\n, Unix имеет \n, у старых macs есть \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 не должно иметь никакого значения.

Ответ 4

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

Ответ 5

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

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

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

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

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

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