Что означают «rb» и «wb» при открытии файла? - PullRequest
0 голосов
/ 22 февраля 2019

Какое значение имеет двоичный режим против режима по умолчанию в Python 3?

Когда я пытаюсь открыть файл выбора, который был сохранен в другом режиме, я получаю сообщение об ошибке, в то время как в Python 2.7 я мог переключитьсямежду режимами без проблем.Проблема может быть легко решена, но почему она имеет значение в первую очередь?

В общем:

  • Какой режим должен быть предпочтительным для большей мобильности?Существует ли конкретный сценарий, в котором режим должен быть предпочтительным (например, работа с текстовыми файлами и т. Д.)?
  • Каковы значения двоичного режима / режима по умолчанию в отношении кодирования, такого как UTF-8?

1 Ответ

0 голосов
/ 24 февраля 2019

Из документов :

Как упоминалось в Overview , Python различает двоичный и текстовый ввод / вывод.Файлы, открытые в двоичном режиме (включая 'b' в аргументе mode ), возвращают содержимое в виде bytes объектов без какого-либо декодирования.В текстовом режиме (по умолчанию или когда 't' включен в аргумент mode ), содержимое файла возвращается как str, причем байты были сначала декодированыиспользуя платформо-зависимую кодировку или используя указанную кодировку , если дано.

Неудивительно, что вы должны использовать текстовый режим (по умолчанию) для текстовых данных и двоичный режим для двоичных данных- включая данные pickle, которые явно определены как двоичные:

Модуль pickle реализует двоичные протоколы для сериализации и десериализацииСтруктура объекта Python. «Pickling» - это процесс, посредством которого иерархия объектов Python преобразуется в поток байтов, а «unpickling» - обратная операция, в результате которой поток байтов (из двоичного файла )файл или https://docs.python.org/3/glossary.html#term-bytes-like-object) преобразуется обратно в иерархию объектов.

Python 3 подходит к различию между текстовыми и двоичными данными совершенно по-разному для Python 2 -действительно, это было основной причиной изменения номера основной версии. В результате иногда бывает так, что код, который не учитывает должным образом различие, кажется, «просто работает» в Python 2 (но затем часто кусает вас неожиданнодальнейшие пути).

...