2011-08-16 1 views
3

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

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

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

ответ

9

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

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

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

f = open("myfile.txt", "rb") 
+1

смогу ли я написать им прямой текст, как если бы я открыл их как «w»? – Kirt

+2

Да, единственное различие между текстовым и двоичным режимами заключается в том, что текстовый режим нормализует ваши строки. –

1

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

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

Одним из решений было бы использовать 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.

Смежные вопросы