Смущенный файловым файлом python "w +"

Из 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