В чем разница между режимами 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' в режим, так что вы можете использовать его независимо от платформы для всех двоичных файлов.

Источник: чтение и запись файлов

Другие вопросы по тегам