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

Разница между разбором текстового файла в режиме r и rb

Что делает синтаксический анализ текстового файла в режиме "r" более удобным, чем разбор его в режиме "rb"? Особенно, если текстовый файл может содержать символы, отличные от ASCII.

4b9b3361

Ответ 1

Это немного зависит от того, какую версию Python вы используете. В Python 2, ответ Криса Драппира.

В Python 3 его другая (и более последовательная) история: в текстовом режиме ('r') Python будет анализировать файл в соответствии с текстовой кодировкой, которую вы ему даете (или, если вы не дадите, зависимое от платформы значение по умолчанию), а read() предоставит вам str. В двоичном ('rb') режиме Python не предполагает, что файл содержит вещи, которые можно разумно анализировать как символы, а read() предоставляет объект bytes.

Кроме того, в Python 3 универсальные новые строки (перевод между '\n' и соглашениями новой строки на платформе, поэтому вам не нужно их заботиться) доступно для текстовых файлов на любой платформе, а не только для Windows.

Ответ 2

из документации:

В Windows, 'b', добавленный в режим, открывает файл в двоичном режиме, поэтому существуют также такие режимы, как "rb", "wb" и "r + b". Python в Windows делает различие между текстовыми и двоичными файлами; конечные символы в текстовых файлах автоматически изменяются, когда данные считываются или записываются. Эта за кадром модификация файловых данных отлично подходит для текстовых файлов ASCII, но они повреждают двоичные данные, подобные этим в файлах JPEG или EXE. Будьте очень осторожны, чтобы использовать двоичный режим при чтении и записи таких файлов. В Unix не помешает добавить "b" в режим, поэтому вы можете использовать его платформу независимо для всех двоичных файлов.

Ответ 3

Разница заключается в том, как обрабатывается конец строки (EOL). Различные операционные системы используют разные символы для маркировки EOL - \n в Unix, \r в версиях Mac до OS X, \r\n в Windows. Когда файл открывается в текстовом режиме, когда файл читается, Python заменяет конечный символ конца строки, указанный в файле, только с \n. И наоборот, т.е. Когда вы пытаетесь написать \n в файл, открытый в текстовом режиме, он будет писать специфичный для ОС символ EOL. Вы можете узнать, что выбрала ОС EOL по умолчанию, проверив os.linesep.

Когда файл открывается в двоичном режиме, сопоставление не происходит. То, что вы читаете, - это то, что вы получаете. Помните, что текстовый режим является режимом по умолчанию. Поэтому, если вы обрабатываете нетекстовые файлы (изображения, видео и т.д.), Убедитесь, что вы открываете файл в двоичном режиме, иначе вы закончите испортить файл, введя (или удалив) несколько байтов.

Python также имеет универсальный режим новой строки. Когда файл открывается в этом режиме, Python отображает все символы \r, \n и \r\n на \n.

Ответ 4

Для пояснения и ответа Комментарий/вопрос Агостино (у меня нет достаточной репутации для комментариев, так что несите со мной, заявляя это как ответ...):

В Python 2 не происходит модификации конца строки, ни в текстовом, ни в двоичном режимах - как было сказано ранее, в Python 2 ответ Криса Drappier (обратите внимание, что его ссылка в настоящее время указывает на документы 3.x Python, но цитируемый текст Криса, конечно, из учебника ввода и вывода Python 2)

Нет, это неправда, что открытие файла в текстовом режиме с помощью Python 2 на не-Windows делает любую модификацию конца строки:

0 $ cat data.txt 
line1
line2
line3
0 $ file data.txt 
data.txt: ASCII text, with CRLF line terminators
0 $ python2.7 -c 'f = open("data.txt"); print f.readlines()'
['line1\r\n', 'line2\r\n', 'line3\r\n']
0 $ python2.7 -c 'f = open("data.txt", "r"); print f.readlines()'
['line1\r\n', 'line2\r\n', 'line3\r\n']
0 $ python2.7 -c 'f = open("data.txt", "rb"); print f.readlines()'

Тем не менее, можно открыть файл в универсальном режиме новой строки в Python 2, который точно выполняет указанный конец строки:

0 $ python2.7 -c 'f = open("data.txt", "rU"); print f.readlines()'
['line1\n', 'line2\n', 'line3\n']

(универсальный спецификатор режима новой строки устарел от Python 3.x)

В Python 3, с другой стороны, концы строк, определенных в конкретной платформе, становятся нормализованными до "\n" при чтении файла в текстовом режиме, а "\n" преобразуется в конец текущей строки по умолчанию для платформы при записи в текстовый режим (в дополнение к декодированию/кодированию байтов ↔ unicode ↔ , которые продолжаются в текстовом режиме). Например. чтение файла DOS/Win CRLF-линии в Linux будет нормализовать конец строки до "\n" .