问题:被python文件模式“ w +”混淆
从文档中
模式“ r +”,“ w +”和“ a +”打开文件进行更新(请注意,“ w +”会截断文件)。在区分二进制文件和文本文件的系统上,将’b’追加到以二进制模式打开文件的模式;在没有此区别的系统上,添加“ b”无效。
与此
w +:打开一个文件进行读写。如果文件存在,则覆盖现有文件。如果该文件不存在,请创建一个新文件以进行读写。
但是,如何读取打开的文件w+
?
回答 0
假设您打开的文件带有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()
调用将尝试从文件末尾读取,并将返回一个空字符串。
回答 1
这是打开文件的不同模式的列表:
[R
打开一个文件以供只读。文件指针放置在文件的开头。这是默认模式。
rb
打开文件以仅以二进制格式读取。文件指针放置在文件的开头。这是默认模式。
r +
打开一个文件进行读取和写入。文件指针将位于文件的开头。
rb +
打开一个文件,以二进制格式读取和写入。文件指针将位于文件的开头。
w
打开仅用于写入的文件。如果文件存在,则覆盖该文件。如果该文件不存在,则创建一个新文件进行写入。
b
打开一个文件,仅以二进制格式写入。如果文件存在,则覆盖该文件。如果该文件不存在,则创建一个新文件进行写入。
w +
打开一个文件进行读写。如果文件存在,则覆盖现有文件。如果该文件不存在,请创建一个新文件以进行读写。
wb +
打开一个文件以进行二进制格式的读写。如果文件存在,则覆盖现有文件。如果该文件不存在,请创建一个新文件以进行读写。
一个
打开一个文件进行追加。如果文件存在,则文件指针位于文件的末尾。也就是说,文件处于附加模式。如果该文件不存在,它将创建一个新文件进行写入。
b
打开文件以二进制格式追加。如果文件存在,则文件指针位于文件的末尾。也就是说,文件处于附加模式。如果该文件不存在,它将创建一个新文件进行写入。
a +
打开文件以进行追加和读取。如果文件存在,则文件指针位于文件的末尾。该文件以追加模式打开。如果该文件不存在,它将创建一个用于读取和写入的新文件。
ab +
打开一个文件,以便以二进制格式追加和读取。如果文件存在,则文件指针位于文件的末尾。该文件以追加模式打开。如果该文件不存在,它将创建一个用于读取和写入的新文件。
回答 2
Python中的所有文件模式
r
阅读r+
打开以进行读写(无法截断文件)w
用于写作w+
用于读写(可以截断文件)rb
用于读取二进制文件。文件指针放置在文件的开头。rb+
读取或写入二进制文件wb+
编写二进制文件a+
打开进行追加ab+
打开一个文件,以附加和读取二进制文件。如果文件存在,则文件指针位于文件的末尾。该文件以追加模式打开。x
打开以进行独占创建,如果文件已存在则失败(Python 3)
回答 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
$
回答 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脚本的:
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将从positon(0,0)覆盖它们。
回答 7
如h4z3所述,为实际使用,有时您的数据太大而无法直接加载所有内容,或者您拥有生成器或实时传入的数据,则可以使用w +存储在文件中并在以后读取。