Вот таблица режимов:
mode-string | truncate? | create? | what's allowed
-------------+-----------+---------+----------------
r | no | no | reading (only)
w | yes | yes | writing (only)
a | no | yes | writing (only), auto-appends
r+ | no | no | read and write
w+ | yes | yes | read and write
a+ | no | yes | read and (auto-appending) write
Обратите внимание, что есть недостающий режим ("читать и без авто append write, который не будет усекать, но будет создавать "). Если вы хотите этого, вы должны использовать функции os
.
(Со всеми из них, добавить b
к концу последовательности режима для работы на байт. Поведение без b
зависит от python2 против Python3, а также возможность universal_newlines
.)
В дополнение ко всему этому , переключение с «режима чтения» на «режим записи» или наоборот, на любой файл, открытый с помощью режима обновления +
, требует операции поиска в большинстве случаев. См. this answer для получения дополнительной информации.
Edit: здесь различные os
операции по открытию файлов, как определено для Unix-подобных систем:
os.open(path, flags, mode)
path
аргумент довольно очевиден, и mode
аргумент используется только если файл (следовательно, может быть опущен, если вы не укажете флаг os.O_CREAT
). Если вы делаете поставку mode
, наиболее распространенное значение - 0666
, что соответствует rw-rw-rw-
. Пользовательский «umask» (см. os.umask
) уберет ненужные разрешения, например, umask от 002
забирает окончательный бит записи, возвращаясь в rw-rw-r--
, а 077
забирает все, кроме начального rw-
. Два других общих режима: 0777
(rwxrwxrwx
для исполняемых файлов) и 0600
(rw-------
для пользовательских файлов, таких как временные файлы при работе с электронной почтой пользователя).
Значение flags
должна включать в себя только один из os.O_RDONLY
, os.O_WRONLY
или os.O_RDWR
: Открыть для чтения (только), писать (только), или обоих.
К этим словам, что вы можете добавить os.O_CREAT
, что означает «создать файл, если он не существует»; os.O_TRUNC
, что означает «обрезать файл до нулевого байта в длину немедленно»; и/или os.O_APPEND
, что означает, что «все операции записи на уровне os неявно стремятся к текущему концу файла непосредственно перед записью».Там может (в зависимости от вкуса ОС) быть больше флагов, таких как O_EXCL
, O_NDELAY
, O_NOFOLLOW
и более. (Тот, который, пожалуй, наиболее часто бывает полезным и надежным, это O_EXCL
, что означает «сбой, если это откроет существующий файл» и, следовательно, действительно полезно в сочетании с O_CREAT
. Используя эти два вместе, вы можете создать новый файл, который вы может гарантировать, что никакой другой процесс сотрудничества в системе также не будет использоваться. Флаг O_NOFOLLOW
, если он существует, также полезен в некоторых контекстах безопасности, чтобы избежать симплексных ловушек.)
Во всех случаях, поставьте на уровне os
, то есть O_RDONLY
, O_WRONLY
или O_RDWR
. Если вы затем оберните дескриптор файла в поток Python с помощью os.fdopen
, вы не сможете получить дополнительные полномочия, которые вы не предоставили себе по адресу open
раз. Вы можете только вычесть часть, т. Е. Вы можете открыть с помощью O_RDWR
, но затем fdopen
поток как для чтения, так и для записи. Кроме того, при использовании fdopen
с режимом обновления раздражающее ограничение, требующее операций поиска или скрытия между различными направлениями ввода/вывода, остается на месте.
Обратите внимание, что a
(добавить) режим на fdopen
уровне, если он повиновался вообще, является «менее мощным», чем в режиме O_APPEND
(или с использованием режима a
с open
или io.open
, все из которых приводят в установлении базового актива O_APPEND
режим). Это в основном связано с взаимодействующими процессами, совместно использующими файл: если два или более таких процессов имеют файлы, открытые с помощью O_APPEND
, пока их записи «достаточно малы» (детали снова меняются с ОС), их записи не будут смешиваться. Если файлы просто открываются как O_WRONLY
или O_RDWR
, два взаимодействующих процесса могут вызывать базовую функцию поиска, а затем основную функцию записи, но если они участвуют в гонке друг за другом, можно перезаписать данные другого.
(Некоторые флаги, в том числе O_APPEND
, можно включить и выключить с помощью fcntl
(от import fcntl
) с F_SETFL
аргумента. Это был сравнительно поздно дополнение к python2.)
«Добавить «здесь может означать буквальное дополнение, но использование побитового или |
операций более условно. То есть, os.open(os.O_RDWR | os.O_CREAT | os.O_TRUNC, 0666)
, а не os.open(os.O_RDWR + os.O_CREAT + os.O_TRUNC, 0666)
.
Zed показывает, как это сделать в его бесплатной книге: http://learnpythonthehardway.org/book/ex16.html –
@ the happy mamba: после 'truncate (0)', 'write()' вставляет некоторые странные символы перед написанием фактического содержания – someguy