Смущает режим файла python «w +»


202

Из документа ,

Режимы «r +», «w +» и «a +» открывают файл для обновления (обратите внимание, что «w +» усекает файл). Добавьте «b» в режим, чтобы открыть файл в двоичном режиме, в системах, которые различают двоичные и текстовые файлы; на системах, которые не имеют этого различия, добавление 'b' не имеет никакого эффекта.

и здесь

w +: открывает файл для записи и чтения. Перезаписывает существующий файл, если файл существует. Если файл не существует, создает новый файл для чтения и записи.

Но как прочитать файл, открытый с w+?


27
Я нашел эту диаграмму весьма полезной.
Ритвик

Ответы:


132

Допустим, вы открываете файл с withзаявлением, как вы должны быть. Тогда вы сделаете что-то вроде этого для чтения из вашего файла:

with open('somefile.txt', 'w+') as f:
    # Note that f has now been truncated to 0 bytes, so you'll only
    # be able to read data that you write after this point
    f.write('somedata\n')
    f.seek(0)  # Important: return to the top of the file before reading, otherwise you'll just read an empty string
    data = f.read() # Returns 'somedata\n'

Обратите внимание f.seek(0)- если вы забудете это, f.read()вызов попытается прочитать с конца файла и вернет пустую строку.


1
что означает "усечение до 0 байтов"?
Насиф Имтиаз Охи

22
@NasifImtiazOhi - Документы Python говорят, что w+«перезапишет существующий файл, если файл существует». Поэтому, как только вы открываете файл с помощью w+, он становится пустым: он содержит 0 байтов. Если раньше он содержал данные, эти данные были усечены - обрезаны и выброшены - и теперь размер файла равен 0 байтам, поэтому вы не можете прочитать какие-либо данные, которые существовали до того, как вы открыли файл с помощью w+. Если вы действительно хотите прочитать предыдущие данные и добавить к ним, вы должны использовать r+вместо w+.
rmunn

как добавить новые данные сверху?
Бека Бухрадзе,

1
@BeqaBukhradze - Если у вас есть вопрос, нажмите кнопку «Задать вопрос», где его увидят сотни людей. Не просто нажмите кнопку «Добавить комментарий», где его увидят только один или два человека.
rmunn

432

Вот список различных режимов открытия файла:

  • р

    Открывает файл только для чтения. Указатель файла помещается в начале файла. Это режим "по умолчанию".

  • Р.Б.

    Открывает файл для чтения только в двоичном формате. Указатель файла помещается в начале файла. Это режим "по умолчанию".

  • г +

    Открывает файл для чтения и записи. Указатель файла будет в начале файла.

  • гь +

    Открывает файл для чтения и записи в двоичном формате. Указатель файла будет в начале файла.

  • вес

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

  • термометру

    Открывает файл для записи только в двоичном формате. Перезаписывает файл, если файл существует. Если файл не существует, создает новый файл для записи.

  • W +

    Открывает файл для записи и чтения. Перезаписывает существующий файл, если файл существует. Если файл не существует, создает новый файл для чтения и записи.

  • термометр +

    Открывает файл для записи и чтения в двоичном формате. Перезаписывает существующий файл, если файл существует. Если файл не существует, создает новый файл для чтения и записи.

  • a

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

  • аб

    Открывает файл для добавления в двоичном формате. Указатель файла находится в конце файла, если файл существует. То есть файл находится в режиме добавления. Если файл не существует, он создает новый файл для записи.

  • а +

    Открывает файл для добавления и чтения. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления. Если файл не существует, он создает новый файл для чтения и записи.

  • аб +

    Открывает файл для добавления и чтения в двоичном формате. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления. Если файл не существует, он создает новый файл для чтения и записи.


так что для всех интенсивных целей r + и w + одинаковы?
Ник Хамрих

21
@Humdinger: Нет, w+создает новый файл или обрезает существующий файл, а затем открывает его для чтения и записи; r+открывает существующий файл, не обрезая его для чтения и записи. Очень разные.
abarnert

Кроме того, как и в случае ответа @ AlokAgarwal, это полный список режимов, но это не так.
abarnert

1
Было бы довольно глупо давать исчерпывающий список режимов, поскольку они функционируют больше как функция с несколькими параметрами. r, wили aявляются эксклюзивными, но bмогут быть добавлены к любому из них, как могут +, или U... Это комбинаторный взрыв.
Рунн

4
rbэто не режим по умолчанию, цитата: The most commonly-used values of mode are 'r' for reading, 'w' for writing (truncating the file if it already exists), and 'a' for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position). If mode is omitted, it defaults to 'r' docs.python.org/2/library/functions.html#open
iggy

158

Все режимы файлов в Python

  • r для чтения
  • r+ открывается для чтения и записи (не может обрезать файл)
  • w для записи
  • w+ для записи и чтения (можно обрезать файл)
  • rbдля чтения двоичного файла. Указатель файла помещается в начале файла.
  • rb+ чтение или запись двоичного файла
  • wb+ запись двоичного файла
  • a+ открывается для добавления
  • ab+Открывает файл для добавления и чтения в двоичном виде. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления.
  • x открыть для эксклюзивного создания, если файл уже существует (Python 3)

5
Это не все режимы. Он пренебрегает, например, rbи wb, не говоря уже о Uрежимах в 2.x и tрежиме в 3.x (которые могут сочетаться со всем, кроме b).
abarnert

1
Разница между r + и w + заключается в том, что w + усекает файл при его открытии. Но вы можете обрезать его вручную в обоих режимах.
Мартин

1
Этот ответ не совпадает с ответом @ 200 OK, например, wb+также читает из файла?
Celeritas

@Celeritas ВБ указывает, что файл открыт для записи в двоичном режиме. В системах Unix (Linux, Mac OS X и т. Д.) Бинарный режим ничего не делает - они обрабатывают текстовые файлы так же, как и любые другие файлы. Однако в Windows текстовые файлы пишутся со слегка измененными окончаниями строк. Это вызывает серьезную проблему при работе с реальными двоичными файлами, такими как exe или jpg. Поэтому при открытии файлов, которые не должны быть текстовыми, даже в Unix, вы должны использовать wb или rb. Используйте обычный w или r только для текстовых файлов.
Алок Агарвал,

В Python 3 также есть режим открытия «x»: открыть для монопольного создания, сбой, если файл уже существует. См. Открытую функцию в док.
Лоран Лапорт

9

r для чтения

w для записи

r+ для чтения / записи без удаления исходного содержимого, если файл существует, в противном случае выдается исключение

w+ для удаления исходного содержимого, затем чтение / запись, если файл существует, в противном случае создайте файл

Например,

>>> with open("file1.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file1.txt", "w+") as f:
...   f.write("c")
... 

$ cat file1.txt 
c$
>>> with open("file2.txt", "r+") as f:
...   f.write("ab\n")
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'file2.txt'

>>> with open("file2.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file2.txt", "r+") as f:
...   f.write("c")
... 

$ cat file2.txt 
cb
$

2

Файл урезан, поэтому вы можете вызывать read()(без исключений, в отличие от того, когда он открывается с помощью 'w'), но вы получите пустую строку.


2

Я подозреваю, что есть два способа справиться с тем, что я думаю, вы пытаетесь достичь.

1) что очевидно, это открыть файл только для чтения, прочитать его в память, затем открыть файл с помощью t, а затем записать свои изменения.

2) использовать процедуры обработки файлов низкого уровня:

# Open file in RW , create if it doesn't exist. *Don't* pass O_TRUNC
 fd = os.open(filename, os.O_RDWR | os.O_CREAT)

Надеюсь это поможет..


Тогда зачем r+
SmartManoj

1

На самом деле, что-то не так во всех других ответах о r+режиме.

test.in содержание файла :

hello1
ok2
byebye3

И сценарий py:

with open("test.in", 'r+')as f:
    f.readline()
    f.write("addition")

Выполните его, и test.inсодержимое будет изменено на:

hello1
ok2
byebye3
addition

Тем не менее, когда мы изменяем скрипт на:

with open("test.in", 'r+')as f:
    f.write("addition")

test.inтакже сделать Ответ:

additionk2
byebye3

Таким образом, r+режим позволит нам охватить контент с самого начала, если мы не делали операцию чтения. И если мы сделаем какую-то операцию чтения, f.write()просто добавим в файл.

Кстати, если мы f.seek(0,0)раньше f.write(write_content), write_content покроет их с позиции (0,0).


0

Как уже упоминалось в h4z3 , для практического использования, иногда ваши данные слишком велики, чтобы загружать все напрямую, или у вас есть генератор, или входящие данные в реальном времени, вы можете использовать w + для сохранения в файле и чтения позже.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.