被python文件模式“w +”困惑
从文档中 ,
模式“r +”,“w +”和“a +”打开文件进行更新(请注意,“w +”会截断文件)。 在区分二进制和文本文件的系统上,以二进制模式打开文件的模式附加'b'; 在没有这个区别的系统上,添加'b'没有任何作用。
在这里
w +:打开一个用于写入和读取的文件。 如果文件存在,则覆盖现有的文件。 如果文件不存在,则创build一个新的文件进行读写。
但是,如何读取用w+
打开的文件呢?
比方说,你打开文件与一个像你应该的声明。 然后你会做这样的事情从你的文件中读取:
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 wrote earlier... 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()
调用将尝试从文件末尾读取,并返回一个空string。
以下是打开文件的不同模式列表:
-
[R
打开文件只读。 文件指针位于文件的开头。 这是默认模式。
-
RB
打开一个只能以二进制格式读取的文件。 文件指针位于文件的开头。 这是默认模式。
-
R +
打开文件进行读写。 文件指针将在文件的开头。
-
RB +
以二进制格式打开文件进行读取和写入。 文件指针将在文件的开头。
-
w ^
打开一个只能写入的文件。 如果文件存在,则覆盖该文件。 如果文件不存在,则创build一个新的文件进行写入。
-
WB
打开一个只能以二进制格式写入的文件。 如果文件存在,则覆盖该文件。 如果文件不存在,则创build一个新的文件进行写入。
-
W +
打开一个用于写入和阅读的文件。 如果文件存在,则覆盖现有的文件。 如果文件不存在,则创build一个新的文件进行读写。
-
WB +
以二进制格式打开一个用于写入和读取的文件。 如果文件存在,则覆盖现有的文件。 如果文件不存在,则创build一个新的文件进行读写。
-
一个
打开一个文件进行追加。 如果文件存在,则文件指针位于文件末尾。 也就是说,该文件处于追加模式。 如果文件不存在,它将创build一个新的文件进行写入。
-
AB
打开一个以二进制格式附加的文件。 如果文件存在,则文件指针位于文件末尾。 也就是说,该文件处于附加模式。 如果文件不存在,它将创build一个新的文件进行写入。
-
A +
为追加和读取打开一个文件。 如果文件存在,则文件指针位于文件末尾。 该文件以附加模式打开。 如果文件不存在,它将创build一个新的文件进行读写。
-
AB +
以二进制格式打开一个文件,用于追加和读取。 如果文件存在,则文件指针位于文件末尾。 该文件以附加模式打开。 如果文件不存在,它将创build一个新的文件进行读写。
Python中的所有文件模式
- 阅读
-
r+
打开读取和写入(不能截断文件) -
w
写作 -
w+
用于写入和读取(可以截断文件) - 用于读取二进制文件的
rb
。 文件指针位于文件的开头。 -
rb+
读取或写入二进制文件 -
wb+
写入一个二进制文件 -
a+
打开以便追加 -
ab+
打开一个文件,用于追加和读取二进制文件。 如果文件存在,则文件指针位于文件末尾。 该文件以附加模式打开。 -
x
打开独家创build,如果文件已经存在则失败(Python 3)
该文件被截断,所以你可以调用read()
(不会引发exception,与使用'w'打开时不同),但会得到一个空string。
我怀疑有两种方式来处理我认为你想达到的目标。
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)
希望这可以帮助..
其实,关于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)
f.seek(0,0)
之前,write_content将会覆盖它们的位置(0,0)。