2017-01-19 11 views
2

Со следующим MWE:чтения() различия между Python 2 и Python 3

with open('a','w') as f: 
    f.write('\r') 
with open('a','r') as f: 
    print(ord(f.read())) 

я получаю следующий результат:

$ python2 test.py 
13 
$ python3 test.py 
10 

Можете ли вы объяснить, почему? Насколько я могу судить, 13 - ожидаемое десятичное число \r в ascii и UTF-8.

+0

'ord ('\ n')' даст вам 10. ShadowRanger объяснил причины. – MYGz

ответ

7

Python 3's open по умолчанию режим универсального Newlines (newline=None), в то время как Python 2's open только обеспечивает режим универсальной, если новые строки строка режима включают U.

В режиме универсального Newlines, последовательность \r (старый Mac), \n (UNIX) или \r\n (DOS/Windows), все признаются переводы строк, и автоматически преобразуются в \n так окончаниях строк имеют согласованное представление для упрощения манипуляций со строками ,

Если вы хотите универсальные символы новой строки в Python 2, вы можете использовать строку режима, чтобы включить его или use io.open, который является почти точным эквивалентом Python 3, построенной в open (io.open на Python 3 является просто еще один способ сказать open).

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

+0

отлично, спасибо. Я думал, что мы уже закончили этот «старый мак» ... – noleti

+0

@noleti: Мы никогда не будем над этим. Я ожидаю, что поеду на могилу с большинством языков, созданных до 2010 года, или на основе языков до 2010 года, которые по-прежнему обрабатывают '\ r' специально, и довольно много новых языков, продолжающих делать это по привычке. Это не похоже на то, что '\ r' обычно используется сам по себе; если люди видят его в текстовых вводах, это либо хакерское консольное управление перенаправлено в файл, либо оно предназначено для использования в качестве новой строки; в любом случае, рассматривая его как новую линию, будет более разумным, чем игнорировать его в большинстве случаев. – ShadowRanger