Из документа ,
Режимы «r +», «w +» и «a +» открывают файл для обновления (обратите внимание, что «w +» усекает файл). Добавьте «b» в режим, чтобы открыть файл в двоичном режиме, в системах, которые различают двоичные и текстовые файлы; на системах, которые не имеют этого различия, добавление 'b' не имеет никакого эффекта.
и здесь
w +: открывает файл для записи и чтения. Перезаписывает существующий файл, если файл существует. Если файл не существует, создает новый файл для чтения и записи.
Но как прочитать файл, открытый с w+
?
Ответы:
Допустим, вы открываете файл с
with
заявлением, как вы должны быть. Тогда вы сделаете что-то вроде этого для чтения из вашего файла:Обратите внимание
f.seek(0)
- если вы забудете это,f.read()
вызов попытается прочитать с конца файла и вернет пустую строку.источник
w+
«перезапишет существующий файл, если файл существует». Поэтому, как только вы открываете файл с помощьюw+
, он становится пустым: он содержит 0 байтов. Если раньше он содержал данные, эти данные были усечены - обрезаны и выброшены - и теперь размер файла равен 0 байтам, поэтому вы не можете прочитать какие-либо данные, которые существовали до того, как вы открыли файл с помощьюw+
. Если вы действительно хотите прочитать предыдущие данные и добавить к ним, вы должны использоватьr+
вместоw+
.Вот список различных режимов открытия файла:
р
Р.Б.
г +
гь +
вес
термометру
W +
термометр +
a
аб
а +
аб +
источник
w+
создает новый файл или обрезает существующий файл, а затем открывает его для чтения и записи;r+
открывает существующий файл, не обрезая его для чтения и записи. Очень разные.r
,w
илиa
являются эксклюзивными, ноb
могут быть добавлены к любому из них, как могут+
, илиU
... Это комбинаторный взрыв.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Все режимы файлов в Python
r
для чтенияr+
открывается для чтения и записи (не может обрезать файл)w
для записиw+
для записи и чтения (можно обрезать файл)rb
для чтения двоичного файла. Указатель файла помещается в начале файла.rb+
чтение или запись двоичного файлаwb+
запись двоичного файлаa+
открывается для добавленияab+
Открывает файл для добавления и чтения в двоичном виде. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления.x
открыть для эксклюзивного создания, если файл уже существует (Python 3)источник
rb
иwb
, не говоря уже оU
режимах в 2.x иt
режиме в 3.x (которые могут сочетаться со всем, кромеb
).wb+
также читает из файла?r
для чтенияw
для записиr+
для чтения / записи без удаления исходного содержимого, если файл существует, в противном случае выдается исключениеw+
для удаления исходного содержимого, затем чтение / запись, если файл существует, в противном случае создайте файлНапример,
источник
Файл урезан, поэтому вы можете вызывать
read()
(без исключений, в отличие от того, когда он открывается с помощью 'w'), но вы получите пустую строку.источник
Я подозреваю, что есть два способа справиться с тем, что я думаю, вы пытаетесь достичь.
1) что очевидно, это открыть файл только для чтения, прочитать его в память, затем открыть файл с помощью t, а затем записать свои изменения.
2) использовать процедуры обработки файлов низкого уровня:
Надеюсь это поможет..
источник
r+
На самом деле, что-то не так во всех других ответах о
r+
режиме.test.in
содержание файла :И сценарий py:
Выполните его, и
test.in
содержимое будет изменено на:Тем не менее, когда мы изменяем скрипт на:
test.in
также сделать Ответ:Таким образом,
r+
режим позволит нам охватить контент с самого начала, если мы не делали операцию чтения. И если мы сделаем какую-то операцию чтения,f.write()
просто добавим в файл.Кстати, если мы
f.seek(0,0)
раньшеf.write(write_content)
, write_content покроет их с позиции (0,0).источник
Как уже упоминалось в h4z3 , для практического использования, иногда ваши данные слишком велики, чтобы загружать все напрямую, или у вас есть генератор, или входящие данные в реальном времени, вы можете использовать w + для сохранения в файле и чтения позже.
источник