В функции open, встроенной в python, какая разница между режимами w
, a
, w+
, a+
и r+
?
В частности, в документации подразумевается, что все эти режимы позволяют производить запись в файл, и говорится, что она открывает файлы для "добавления", "записи" и "обновления", но не определяется, что означают эти термины.
Режимы открытия точно такие же, как и для функции стандартной библиотеки C fopen()
.
Руководящая страница BSD fopen
определяет их следующим образом:
The argument mode points to a string beginning with one of the following
sequences (Additional characters may follow these sequences.):
``r'' Open text file for reading. The stream is positioned at the
beginning of the file.
``r+'' Open for reading and writing. The stream is positioned at the
beginning of the file.
``w'' Truncate file to zero length or create text file for writing.
The stream is positioned at the beginning of the file.
``w+'' Open for reading and writing. The file is created if it does not
exist, otherwise it is truncated. The stream is positioned at
the beginning of the file.
``a'' Open for writing. The file is created if it does not exist. The
stream is positioned at the end of the file. Subsequent writes
to the file will always end up at the then current end of file,
irrespective of any intervening fseek(3) or similar.
``a+'' Open for reading and writing. The file is created if it does not
exist. The stream is positioned at the end of the file. Subse-
quent writes to the file will always end up at the then current
end of file, irrespective of any intervening fseek(3) or similar.
Я заметил, что каждый сейчас и потом мне гуглить функции fopen снова и снова, просто чтобы строить мысленный образ того, что основные различия между режимами. Так, я думал, что схема будет быстрее читать в следующий раз. Может кто-то еще тоже нахожу это полезным.
Же информация, только в виде таблицы
| r r+ w w+ a a+
------------------|--------------------------
read | + + + +
write | + + + + +
write after seek | + + +
create | + + + +
truncate | + +
position at start | + + + +
position at end | + +
где значения являются: (просто, чтобы избежать любых недоразумений)
read - чтение из файла допускается
write - запись в файл разрешена
создать - файл создается, если он еще не существует
trunctate - при открытии файла он сделан пустой (все содержимое файла стирается)
позиция на старте - после открытия файла, начальная позиция устанавливается в начало файла
позиция на конце - после открытия файла, начальная позиция устанавливается в конец файла
Примечание: "а" и "А+" всегда добавлять в конец файла - игнорирует любые искать
движений.
Кстати. интересное поведение, по крайней мере у меня на Win7 / вместо python2.7, для открытия нового файла в режиме а+
:
писать('АА'); обращаться(0, 0); чтение(1); написать('б')
Второй писать
игнорируется
писать('АА'); обращаться(0, 0); чтение(2); писать('б')
Второй пишут
вызывает IOError
Параметры такие же, как и для функции fopen в стандартной библиотеке C:
w
усекает файл, перезаписывая все, что там уже было
a
добавляет к файлу все, что там уже было
w+
открывает для чтения и записи, усекая файл, но также позволяя вам читать обратно то, что было записано в файл
a+
открывается для добавления и чтения, позволяя как добавлять в файл, так и читать его содержимое
Я наткнулся на это, пытаясь понять, почему вы используете режим 'w+' против 'w'. В итоге я просто провел тестирование. Я не вижу особого смысла в использовании режима 'w+', поскольку в обоих случаях файл изначально усечен. Однако, с 'w+', вы можете читать после записи, обращаясь назад. Если вы попытаетесь выполнить чтение с помощью 'w', это вызовет ошибку IOError. Чтение без использования seek с режимом 'w+' ничего не даст, так как указатель файла будет после места записи.
Я думаю, что это важно учитывать для кросс-платформенного исполнения, т. е. как Суа. :)
в Windows 'б' добавлен режим открывает файл в двоичном режиме, поэтому существуют также режимы, как 'РБ', 'ВБ' и 'р+б'. Python на Windows, делает различие между текстовыми и двоичными файлами; в конце строки символов в текстовые файлы автоматически слегка изменили, когда данные считываются или записываются. Этот закулисный внесении изменений в файл данных штраф за текстовые файлы, но это поврежден бинарных данных, например, в JPEG или EXE файлы. Будьте очень осторожны, чтобы использовать двоичный режим при чтении и записи таких файлов. В Unix, это не больно, чтобы добавить 'б' в режиме, так что вы можете использовать его независимо от платформы для бинарных файлов.
Это прямо цитата из программного обеспечения на Python 2.7.х.