Смущает режим файла python "w+"
Из документа,
Режимы "r+", "w+" и "a+" открывают файл для обновления (обратите внимание, что "w+" усекает файл). Добавьте "b" в режим, чтобы открыть файл в двоичном режиме, в системах, которые различают двоичные и текстовые файлы; на системах, которые не имеют этого различия, добавление 'b' не имеет никакого эффекта.
и здесь
w+: открывает файл для записи и чтения. Перезаписывает существующий файл, если файл существует. Если файл не существует, создает новый файл для чтения и записи.
Но, как прочитать файл, открытый с w+
?
11 ответов
Допустим, вы открываете файл с 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()
call попытается прочитать с конца файла и вернет пустую строку.
Вот список различных режимов открытия файла:
р
Открывает файл только для чтения. Указатель файла находится в начале файла. Это режим "по умолчанию".
Р.Б.
Открывает файл для чтения только в двоичном формате. Указатель файла находится в начале файла. Это режим "по умолчанию".
г +
Открывает файл для чтения и записи. Указатель файла будет в начале файла.
гь +
Открывает файл для чтения и записи в двоичном формате. Указатель файла будет в начале файла.
вес
Открывает файл только для записи. Перезаписывает файл, если файл существует. Если файл не существует, создает новый файл для записи.
термометру
Открывает файл для записи только в двоичном формате. Перезаписывает файл, если файл существует. Если файл не существует, создает новый файл для записи.
ш +
Открывает файл для записи и чтения. Перезаписывает существующий файл, если файл существует. Если файл не существует, создает новый файл для чтения и записи.
термометр +
Открывает файл для записи и чтения в двоичном формате. Перезаписывает существующий файл, если файл существует. Если файл не существует, создает новый файл для чтения и записи.
Открывает файл для добавления. Указатель файла находится в конце файла, если файл существует. То есть файл находится в режиме добавления. Если файл не существует, он создает новый файл для записи.
аб
Открывает файл для добавления в двоичном формате. Указатель файла находится в конце файла, если файл существует. То есть файл находится в режиме добавления. Если файл не существует, он создает новый файл для записи.
а +
Открывает файл для добавления и чтения. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления. Если файл не существует, он создает новый файл для чтения и записи.
аб +
Открывает файл для добавления и чтения в двоичном формате. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления. Если файл не существует, он создает новый файл для чтения и записи.
Все режимы файлов в Python
r
для чтенияr+
открывается для чтения и записи (не может обрезать файл)w
для записиw+
для записи и чтения (можно обрезать файл)rb
для чтения двоичного файла. Указатель файла находится в начале файла.rb+
чтение или запись двоичного файлаwb+
запись двоичного файлаa+
открывается для добавленияab+
Открывает файл для добавления и чтения в двоичном виде. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления.x
открыть для эксклюзивного создания, если файл уже существует (Python 3)
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
$
Кажется, оба работают одинаково, но есть загвоздка.
г +:-
- Откройте файл для чтения и записи
- После открытия в начале указатель файла будет указывать на 0
- Теперь, если вы захотите Читать, он начнет читать с начала
- если вы хотите написать, тогда начните писать, но процесс записи начнется с указателя 0. Таким образом, будет перезапись символов, если они есть
- В этом случае файл должен присутствовать, либо будет вызвана ошибка FileNotFoundError.
w+:-
- Откройте файл для чтения и записи
- Если файл существует, он будет открыт, и все данные будут стерты,
- Если файл не существует, будет создан новый файл
- В начале указатель файла будет указывать на 0 (так как данных нет)
- Теперь, если вы хотите что-то написать, то напишите
- Указатель файла теперь будет указывать на конец файла (после процесса записи)
- Если вы хотите прочитать данные сейчас, найдите конкретную точку. (для начала поиска (0))
Итак, в целом говорится, что оба предназначены для открытия файла для чтения и записи, но разница в том, хотим ли мы стереть данные в начале, а затем выполнить чтение / запись или просто начать как есть.
abc.txt
- в начале
1234567
abcdefg
0987654
1234
Code for r+
with open('abc.txt', 'r+') as f: # abc.txt should exist before opening
print(f.tell()) # Should give ==> 0
f.write('abcd')
print(f.read()) # Pointer is pointing to index 3 => 4th position
f.write('Sunny') # After read pointer is at End of file
Output
0
567
abcdefg
0987654
1234
abc.txt
- После бега:
abcd567
abcdefg
0987654
1234Sunny
Сброс abc.txt в качестве исходного
Code for w+
with open('abc.txt', 'w+') as f:
print(f.tell()) # Should give ==> 0
f.write('abcd')
print(f.read()) # Pointer is pointing to index 3 => 4th position
f.write('Sunny') # After read pointer is at End of file
Output
0
abc.txt
- После бега:
abcdSunny
На самом деле, что-то не так во всех других ответах о 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).
Я подозреваю, что есть два способа справиться с тем, что я думаю, вы пытаетесь достичь.
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)
Надеюсь это поможет..
Файл урезан, поэтому вы можете позвонить read()
(без исключений, в отличие от того, когда открывается с помощью 'w'), но вы получите пустую строку.
Я тоже был ооочень запутанным... Но, может быть, мой ответ поможет кому-то. Я предполагаю, что вы хотите использовать возможность режима «w+» для создания файла, если он не существует.
Действительно, только w, w+, a, a+ могут создавать, если файл не существует.
Но если вам нужно прочитать данные файла (сценарий, когда файл с данными действительно существовал), вы не можете сделать это с помощью w+ из коробки, потому что он обрезает файл. Ой, вы не это имели в виду!
Так что, возможно, вашим лучшим другом будет + с file.seek(0):
with open('somefile.txt', 'a+') as f:
f.seek(0)
for line in f:
print(f.readline())
Вот список может быть полезен
Символ Значение
'r' - открыть для чтения (по умолчанию)
'w' - открыть для записи, сначала усекая файл
'x' - открыть для эксклюзивного создания, ошибка, если файл уже существует
'a' - открыть для записи, дописав в конец файла, если он существует
'b' - двоичный режим
't' - текстовый режим (по умолчанию)
'+' - открыт для обновления (чтения и записи)
Режим по умолчанию — «r» (открыт для чтения текста, синоним «rt»). Режимы «w+» и «w+b» открывают и обрезают файл. Режимы 'r+' и 'r+b' открывают файл без усечения.
Ссылка:https://docs.python.org/3/library/functions.html#open
Как упоминал h4z3, для практического использования, иногда ваши данные слишком велики, чтобы напрямую загружать все, или у вас есть генератор, или входящие данные в реальном времени, вы можете использовать w+ для хранения в файле и последующего чтения.