Python для Windows когда-либо вставляет '\ r \ n', когда сказано вставить '\ n'? - PullRequest
3 голосов
/ 16 августа 2011

Я использую ПК дома и Mac на работе. У меня никогда не было проблем с разрывами строк в сценариях Python или их выводами, но всякий раз, когда я отправляю что-то своему боссу, я получаю гневное электронное письмо о разрывах строк в Windows.

Самым последним был вывод скрипта на python, в котором я сказал, что каждая строка должна заканчиваться символом '\ n', но при ближайшем рассмотрении (на моем Mac на работе) кажется, что каждая строка действительно заканчивалась на '\ г \ п'.

Что происходит, и как мне это остановить? Раньше я запускал все свои скрипты на виртуальной машине Linux дома, но обнаружил, что это слишком медленно и с трудом, наверняка есть более простое решение?

Ответы [ 2 ]

9 голосов
/ 16 августа 2011

Это потому, что у вас есть файлы, открытые в текстовом режиме, и Python нормализует переводы строк в соответствии с используемой платформой (Windows использует \r\n, а Linux просто использует \n). Вам нужно открыть файлы в двоичном режиме, например:

f = open("myfile.txt","wb")

Это делает то же самое в обратном порядке, когда вы читаете в файлах (\r\n будет заменено на \n), если вы также не укажете двоичный режим:

f = open("myfile.txt", "rb")
1 голос
/ 16 августа 2011

Поведение, которое вы видите, не зависит от Python.Это происходит из буферизированных функций обработки файлов в стандартной библиотеке C, которая лежит в основе Python и других языков высокого уровня.Если не указано иное, он преобразует символы новой строки в последовательность разрыва строки исходного текстового файла текущей платформы при записи и делает обратное при чтении.Подробности смотрите в документации по fopen() в вашей локальной системе.В Windows это означает, что \ n будет преобразовано в \ r \ n при записи.

В документах Python упоминается преобразование новой строки и другие параметры режима open() здесь .

Одним из решений было бы использование open("filename", "wb") вместо open("filename", "w") при первом открытии выходного файла.Это позволит избежать автоматического преобразования новой строки.Это должно решить проблему для вашего босса, если ваш босс использует некую форму Unix (включая OSX).К сожалению, это также будет означать, что некоторые текстовые редакторы Windows (например, блокнот?) Будут странно представлять ваш файл:

Windows acts like a teletype
                            when it sees new lines
                                                  without carriage returns.

Другой подход - преобразовать файлы по мере необходимости, прежде чем отправлять их кому-то, кто этого не делает.использовать Windows.Для этого существуют различные конверсионные программы, такие как dos2unix и flip.

...