В чем разница между режимами rb и r+b в файловых объектах
Я использую модуль pickle в Python и пробую разные режимы ввода-вывода файлов:
# works on windows.. "rb"
with open(pickle_f, 'rb') as fhand:
obj = pickle.load(fhand)
# works on linux.. "r"
with open(pickle_f, 'r') as fhand:
obj = pickle.load(fhand)
# works on both "r+b"
with open(pickle_f, 'r+b') as fhand:
obj = pickle.load(fhand)
Я никогда не читал о режиме "r+b", но упомянул об этом в документации.
я получаю EOFError
на Linux, если я использую "rb"
режим и в Windows, если "r"
используется. Я просто дал "r+b"
режим выстрел, и он работает на обоих.
какой "r+b"
Режим? В чем разница между "rb" и "r+b"? Почему это работает, когда другие нет?
4 ответа
r+
используется для чтения и записи. b
для двоичногоr+b
Режим открыт бинарный файл в режиме чтения или записи.
Вы можете прочитать больше здесь.
r
открывается для чтения, тогда как r+
открывается для чтения и письма. b
для двоичного
Это прописано в документации:
Наиболее часто используемые значения режима
'r'
для чтения,'w'
для записи (усечение файла, если он уже существует), и'a'
для добавления (что в некоторых системах Unix означает, что все записи добавляются в конец файла независимо от текущей позиции поиска). Если режим не указан, по умолчанию'r'
, По умолчанию используется текстовый режим, который может конвертировать'\n'
символы для платформенного представления при записи и обратно при чтении. Таким образом, при открытии бинарного файла, вы должны добавить'b'
значение режима, чтобы открыть файл в двоичном режиме, что улучшит переносимость. (добавление'b'
полезен даже в системах, которые не обрабатывают двоичные и текстовые файлы по-разному, где он служит документацией.) Более подробные значения режима см. ниже.Режимы
'r+'
,'w+'
а также'a+'
откройте файл для обновления (обратите внимание, что'w+'
обрезает файл). присоединять'b'
в режим открытия файла в двоичном режиме в системах, которые различают двоичные и текстовые файлы; на системах, которые не имеют этого различия, добавив'b'
не имеет никакого эффекта
Я понимаю, что добавление r+
открывается для чтения и записи (так же, как w+
, хотя, как указано в комментарии, будет урезать файл). b
просто открывает его в двоичном режиме, который должен меньше знать о таких вещах, как разделители строк (по крайней мере, в C++).
В Windows добавленный к режиму "b" открывает файл в двоичном режиме, поэтому существуют также режимы, такие как "rb", "wb" и "r+b". Python в Windows делает различие между текстовыми и двоичными файлами; символы конца строки в текстовых файлах автоматически немного изменяются при чтении или записи данных. Это закулисное изменение данных файла подходит для текстовых файлов ASCII, но оно повредит двоичные данные, подобные этим в файлах JPEG или EXE. Будьте очень осторожны, используя двоичный режим при чтении и записи таких файлов. В Unix не помешает добавить 'b' в режим, так что вы можете использовать его независимо от платформы для всех двоичных файлов.
Источник: чтение и запись файлов