Смущает режим файла 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+ для хранения в файле и последующего чтения.

Другие вопросы по тегам