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

610

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

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

ЭЛЕКТРОДИСТАНЦИОННАЯ СИСТЕМА УПРАВЛЕНИЯ
источник
11
Ссылка, которую вы предоставили, точно определяет значения. Какую часть предоставленной вами ссылки вы не видите или не понимаете? Не могли бы вы уточнить свой вопрос, чтобы объяснить, что вы не поняли о ссылке?
S.Lott
@ChrisB. - Я сообщил об этом как об ошибке на bugs.python.org/issue19627
Bulwersator
2
нет ли простого и единственного документа, объясняющего, что означает знак +?
Чарли Паркер

Ответы:

740

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

Страница fopenруководства BSD определяет их следующим образом:

 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.
drAlberT
источник
3
Я полагаю, вы имеете в виду вызов fopen в стандартной библиотеке C (который не является системным вызовом)
Eli Courtwright
15
ПРИМЕЧАНИЕ. В Python v3 добавлен ряд дополнительных режимов. ссылка на документы
Alex
5
Отметил, что wи w+оба могут сделатьThe file is created if it does not exist
Вей Ян
4
В Windows bдобавляется в режиме открывает файл в двоичном режиме, таким образом , есть также режимы , такие как rb, wb, и r+b. Python в Windows делает различие между текстовыми и двоичными файлами; символы конца строки в текстовых файлах автоматически слегка изменяются при чтении или записи данных.
6
Прав ли я сказать, что +не делает что-то непротиворечивое независимо, если это так a, wили r? Или я не вижу картины? Какой шаблон?
Чарли Паркер
510

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

Анджей Пронобис
источник
3
aОписание неправильно . Записи всегда располагаются в конце.
Антти Хаапала
10
@ И я считаю, что @Antti имеет в виду свойство, Subsequent writes to the file will always end up at the then current end of file, irrespective of any intervening fseek(3) or similarкоторое несколько сильнее, чем просто сказать, что начальная позиция - это конец.
jcai
8
@CharlieParker То, что есть в основном две файловые операции (чтение, запись). Режим r предназначен главным образом для чтения, режимы w , a предназначены главным образом для записи. А знак плюс разрешает вторую операцию для данного режима (проще говоря).
Jeyekomon
22
Для потомков: усечь означает перезаписать с самого начала.
Минь Чан
4
@Jeyekomon Ваше резюме в вашем комментарии здесь, вероятно, единственная самая полезная вещь, которую я прочитал, пытаясь обдумать эти режимы способом, который я теперь могу запомнить! Блок-схема в этом ответе прекрасна, и таблица в ответе ниже великолепна, но если бы эти ответы (и другие в другом месте) начинались с этого простого пункта и работали оттуда, это помогло бы обеспечить намного лучшую умственную основу для подвешивания деталей на. Тогда спасибо. (Я знаю, что это может быть на границе спама, но я чувствовал, что ваш комментарий заслуживает подтверждения) 💯
Тим
206

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

                  | 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

industryworker3595112
источник
10
Почему нет «Создать файл, если он не существует. Если он существует, позиционировать при запуске, включить чтение и запись»? Это наиболее очевидный вариант использования для меня: я храню данные в файле. Если файла нет, создайте его вместо ошибок. Если в файле есть данные, которые я хочу прочитать все сверху, обновите некоторые данные, а затем полностью переписайте файл с 0 на СЛЕДУЮЩЕЕ ВРЕМЯ, когда я его загружу. Я использую open(file,'a'); close(); open(file,'r+')для этого.
тупица
2
Что означает «усечение» в этом контексте?
Чарли Паркер
3
@CharlieParker Это означает, что все содержимое файла удалено (файл сделан пустым)
industryworker3595112
1
Возможно, вы захотите добавить примечание, что with aи a+write всегда будет происходить в конце файла, независимо от того, перемещаете ли вы указатель вручную, используя seek().
балу
1
Как насчет обновления таблицы, чтобы включить 'x' для Python 3?
Никос Александрис
39

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

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

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

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

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

Эли Кортрайт
источник
2
Что означает «усечение» в этом контексте? Значит ли это удалить старые данные, если они были? Или что-то еще более конкретное?
Чарли Паркер
3
@CharlieParker: правильно - это означает, что все данные в существующем файле будут удалены, и мы начнем запись с начала пустого файла.
Эли Кортрайт
9

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

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

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

Горан Б.
источник
9

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

Wyrmwood
источник