Открытая встроенная функция python: разница между режимами a, a +, w, w + и r +?

В встроенной открытой функции python какова точная разница между режимами w, a, w+, a+ и r+?

В частности, документация подразумевает, что все они позволят писать в файл и говорят, что они открывают файлы для "добавления", "записи" и "обновления" в частности, но не определяют, что означают эти термины.

Ответ 1

Режимы открытия точно такие же, как и для стандартной библиотечной функции C fopen().

BSD fopen manpage определяет их следующим образом:

 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.

Ответ 2

Я заметил, что время от времени мне нужно снова открывать Google, просто чтобы создать мысленный образ того, какие основные различия между режимами. Итак, я думал, что диаграмма будет быстрее читать в следующий раз. Возможно, кто-то еще найдет это полезным.

Ответ 3

Такая же информация, как раз в таблице

                  | r   r+   w   w+   a   a+
------------------|--------------------------
read              | +   +        +        +
write             |     +    +   +    +   +
write after seek  |     +    +   +
create            |          +   +    +   +
truncate          |          +   +
position at start | +   +    +   +
position at end   |                   +   +

где значения: (просто чтобы избежать какой-либо неправильной интерпретации)

  • чтение - чтение из файла разрешено
  • запись - запись в файл разрешена

  • create-file создается, если он еще не существует

  • trunctate - при открытии файла он становится пустым (все содержимое файла стирается)

  • позиция при запуске - после открытия файла начальная позиция устанавливается на начало файла

  • позиция в конце - после открытия файла начальная позиция устанавливается в конец файла

Примечание: a и a+ всегда добавляются к концу файла - игнорируют любые движения seek.
КСТАТИ. интересное поведение, по крайней мере, на моем win7/python2.7, для нового файла, открытого в режиме a+:
write('aa'); seek(0, 0); read(1); write('b') write('aa'); seek(0, 0); read(1); write('b') - вторая write игнорируется
write('aa'); seek(0, 0); read(2); write('b') write('aa'); seek(0, 0); read(2); write('b') - вторая write вызывает IOError

Ответ 4

Параметры те же, что и для функция fopen в стандартной библиотеке C:

w обрезает файл, перезаписывая все, что уже было там

a присоединяется к файлу, добавляя к тому, что уже было там

w+ открывается для чтения и записи, обрезая файл, но также позволяя вам прочитать, что было записано в файл

a+ открывается для добавления и чтения, позволяя вам как добавлять в файл, так и читать его содержимое

Ответ 5

Я натолкнулся на это, пытаясь понять, почему вы используете режим 'w +' по сравнению с 'w'. В конце концов, я просто проверил некоторые тесты. Я не вижу большой цели для режима 'w +', как и в обоих случаях, файл сначала усекается. Однако, с помощью "w +", вы можете читать после записи, ища назад. Если вы пробовали читать с помощью "w", это заставило бы IOError. Чтение без использования поиска с режимом "w +" ничего не даст, так как указатель файла будет после того, где вы написали.

Ответ 6

Я думаю, что это важно рассмотреть для кросс-платформенного исполнения, т.е. как CYA.:)

В Windows, 'b', добавленный в режим, открывает файл в двоичном режиме, поэтому существуют также такие режимы, как "rb", "wb" и "r + b". Python в Windows делает различие между текстовыми и двоичными файлами; конечные символы в текстовых файлах автоматически изменяются, когда данные считываются или записываются. Эта за кадром модификация файловых данных отлично подходит для текстовых файлов ASCII, но они повреждают двоичные данные, подобные этим в файлах JPEG или EXE. Будьте очень осторожны, чтобы использовать двоичный режим при чтении и записи таких файлов. В Unix не помешает добавить "b" в режим, поэтому вы можете использовать его платформу независимо для всех двоичных файлов.

Это прямо цитируется Python Software Foundation 2.7.x.