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



в python встроенный открыть

758   6  

6 ответов:

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

в полицию 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.

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

такая же информация, только в виде таблицы

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

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

  • read - чтение из файла допускается
  • write - запись в файл разрешена

  • создать-файл создается, если он еще не существует

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

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

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

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

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

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

a добавляет в файл, добавляя к тому, что уже было

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

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

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

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

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

Это прямо цитата из Python Software Foundation 2.7.x.

Comments

    Ничего не найдено.