Из doc,
Режимы 'r +', 'w +' и 'a +' открывают файл для обновления (обратите внимание, что 'w +' обрезает файл). Добавить "b" в режим открытия файла в двоичном режиме, в системах, которые различают двоичные и текстовые файлы; на системах, которые не имеют этого различия, добавление "b" не имеет эффекта.
и здесь
w +: открывает файл для записи и чтения. Перезаписывает существующий файл, если файл существует. Если файл не существует, создается новый файл для чтения и записи.
Но как читать файл с помощью w+
?
Ответ 1
Допустим, вы открываете файл 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()
попытается прочитать с конца файла и вернет пустую строку.
Ответ 2
Ниже приведен список различных способов открытия файла:
-
т
Открывает файл только для чтения. Указатель файла помещается в начале файла. Это режим по умолчанию.
-
гь
Открывает файл для чтения только в двоичном формате. Указатель файла помещается в начале файла. Это режим по умолчанию.
-
г +
Открывает файл для чтения и записи. Указатель файла будет в начале файла.
-
гь +
Открывает файл для чтения и записи в двоичном формате. Указатель файла будет в начале файла.
-
со
Открывает файл только для записи. Перезаписывает файл, если файл существует. Если файл не существует, создается новый файл для записи.
-
термометру
Открывает файл для записи только в двоичном формате. Перезаписывает файл, если файл существует. Если файл не существует, создается новый файл для записи.
-
W +
Открывает файл для записи и чтения. Перезаписывает существующий файл, если файл существует. Если файл не существует, создается новый файл для чтения и записи.
-
термометру +
Открывает файл для записи и чтения в двоичном формате. Перезаписывает существующий файл, если файл существует. Если файл не существует, создается новый файл для чтения и записи.
-
а
Открывает файл для добавления. Указатель файла находится в конце файла, если файл существует. То есть, файл находится в режиме добавления. Если файл не существует, он создает новый файл для записи.
-
аб
Открывает файл для добавления в двоичном формате. Указатель файла находится в конце файла, если файл существует. То есть, файл находится в режиме добавления. Если файл не существует, он создает новый файл для записи.
-
а +
Открывает файл для добавления и чтения. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления. Если файл не существует, он создает новый файл для чтения и записи.
-
аб +
Открывает файл для добавления и чтения в двоичном формате. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления. Если файл не существует, он создает новый файл для чтения и записи.
Ответ 3
Все режимы файлов в Python
-
r
для чтения
-
r+
открывается для чтения и записи (не может обрезать файл)
-
w
для записи
-
w+
для записи и чтения (может обрезать файл)
-
rb
для чтения двоичного файла. Указатель файла помещается в начале файла.
-
rb+
чтение или запись двоичного файла
-
wb+
запись двоичного файла
-
a+
открывается для добавления
-
ab+
Открывает файл для добавления и чтения в двоичном формате. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления.
-
x
открыт для исключительного создания, если файл уже существует (Python 3)
Ответ 4
Файл обрезается, поэтому вы можете вызывать read()
(исключений не было, в отличие от того, когда они были открыты с использованием "w" ), но вы получите пустую строку.
Ответ 5
Я подозреваю, что есть два способа справиться с тем, что, как я думаю, вы пытаетесь достичь.
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)
Надеюсь, что это поможет.
Ответ 6
Собственно, что-то не так во всех остальных ответах о режиме r+
.
test.in
содержимое файла:
hello1
ok2
byebye3
И py script:
with open("test.in", 'r+')as f:
f.readline()
f.write("addition")
Выполните его, а содержимое test.in
будет изменено на:
hello1
ok2
byebye3
addition
Однако, когда мы изменяем script на:
with open("test.in", 'r+')as f:
f.write("addition")
the test.in
также ответьте:
additionk2
byebye3
Итак, режим r+
позволит нам покрывать контент с самого начала, если мы не выполнили операцию чтения. И если мы выполним некоторую операцию чтения, f.write()
просто добавит файл.
Кстати, если мы f.seek(0,0)
до f.write(write_content)
, то write_content будет покрывать их из позиции (0,0).
Ответ 7
Как уже упоминалось в h4z3, для практического использования, иногда ваши данные слишком велики, чтобы загружать все напрямую, или у вас есть генератор или поступающие данные в реальном времени, вы можете использовать w+ для сохранения в файле и чтения позже.
Ответ 8
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
$
Ответ 9
да V