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

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

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

10 ответов

Решение

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

BSDfopen 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, чтобы создать мысленное представление о том, каковы основные различия между режимами. Итак, я думал, что диаграмма будет читать быстрее в следующий раз. Может быть, кто-то еще найдет это полезным.

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

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

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

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

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

  • 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+ открывается для добавления и чтения, позволяя вам как добавить файл, так и прочитать его содержимое

Если режим не выбран; текстовый режим ( t) используется. Как таковой r такой же как rt.

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

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

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

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

Я считаю важным отметить, что python 3 определяет режимы открытия иначе, чем ответы здесь, которые были правильными для Python 2.

Эти режимы открытия Pyhton 3 являются:

      'r' open for reading (default)
'w' open for writing, truncating the file first
'x' open for exclusive creation, failing if the file already exists
'a' open for writing, appending to the end of the file if it exists
----
'b' binary mode
't' text mode (default)
'+' open a disk file for updating (reading and writing)
'U' universal newlines mode (for backwards compatibility; should not be used in new code)

Режимы, w, x, a сочетаются с модификаторами режима bили же . необязательно добавляется, U необходимо избегать.

Как я выяснил на собственном опыте, рекомендуется всегда указывать t при открытии файла в текстовом режиме, поскольку r является псевдонимом для стандартной функции, но псевдонимом для open() функции всех модулей сжатия (например, при чтении *.bz2 файл).

Таким образом, режимы открытия файла должны быть:

rt / wt / xt / at для чтения / записи / создания / добавления в файл в текстовом режиме и

rb / wb / xb / ab для чтения / записи / создания / добавления в файл в двоичном режиме.

Использовать + как прежде.

Функция open() открывает файл (если возможно) и возвращает соответствующий файловый объект. ...............


Синтаксис open():open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)


open(file,mode) mode Параметр Это может быть только в соответствии с таблицей ниже:



'r' Открыть файл для чтения. (дефолт)


'w' Открыть файл для записи. Создает новый файл, если он не существует, или усекает файл, если он существует.


'x' Открыть файл для монопольного создания. Если файл уже существует, операция завершится ошибкой.


'a' Открыть для добавления в конец файла без его усечения. Создает новый файл, если он не существует.


't' Открыть в текстовом режиме. (дефолт)


'b' Открыть в двоичном режиме.


'+' Открыть файл для обновления (чтения и записи)



Особое сомнение, которое возникает у многих людей, это «В чем разница между режимами r+ и w+?».

r+ помогает читать и записывать данные в уже существующий файл без усечения (ошибка, если такого файла нет).

С другой стороны, режим w+ также разрешает чтение и запись, но усекает файл (если такого файла не существует - создается новый файл). Если вам интересно, как можно читать из усеченного файла, методы чтения можно использовать для чтения вновь записанного файла (или пустого файла).

Ваше здоровье!

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