来自doc,
模式'r +','w +'和'a +'打开文件进行更新(注意'w +'截断文件)。将“b”附加到模式以在二进制模式下打开文件,在区分二进制文件和文本文件的系统上;在没有这种区别的系统上,添加'b'没有效果。
和here
w +:打开文件进行书写和阅读。如果文件存在,则覆盖现有文件。如果该文件不存在,则创建一个用于读写的新文件。
但是,如何阅读使用w+
打开的文件?
答案 0 :(得分:329)
打开文件以供阅读。文件指针位于文件的开头。这是默认模式。
打开文件以仅以二进制格式读取。文件指针位于文件的开头。这是默认模式。
打开文件进行读写。文件指针位于文件的开头。
打开二进制格式的读写文件。文件指针位于文件的开头。
打开文件仅供写入。如果文件存在,则覆盖文件。如果该文件不存在,则创建一个用于写入的新文件。
打开仅以二进制格式写入的文件。如果文件存在,则覆盖文件。如果该文件不存在,则创建一个用于写入的新文件。
打开文件进行书写和阅读。如果文件存在,则覆盖现有文件。如果该文件不存在,则创建一个用于读写的新文件。
打开文件,以二进制格式写入和读取。如果文件存在,则覆盖现有文件。如果该文件不存在,则创建一个用于读写的新文件。
打开要追加的文件。如果文件存在,则文件指针位于文件的末尾。也就是说,文件处于追加模式。如果该文件不存在,则会创建一个用于写入的新文件。
打开一个文件,以二进制格式附加。如果文件存在,则文件指针位于文件的末尾。也就是说,文件处于追加模式。如果该文件不存在,则会创建一个用于写入的新文件。
打开文件以进行追加和阅读。如果文件存在,则文件指针位于文件的末尾。该文件以追加模式打开。如果该文件不存在,则会创建一个用于读写的新文件。
打开以二进制格式追加和读取的文件。如果文件存在,则文件指针位于文件的末尾。该文件以追加模式打开。如果该文件不存在,则会创建一个用于读写的新文件。
答案 1 :(得分:129)
Python中的所有文件模式
r
阅读r+
打开以进行读写(不能截断文件)w
撰写w+
用于书写和阅读(可以截断文件)rb
用于读取二进制文件。文件指针位于文件的开头。rb+
读取或写入二进制文件wb+
编写二进制文件a+
会打开以追加ab+
打开一个文件,用于追加和读取二进制文件。如果文件存在,则文件指针位于文件的末尾。该文件以追加模式打开。x
打开以进行独占创建,如果文件已存在则失败(Python 3)答案 2 :(得分:99)
假设您正在使用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()
调用将尝试从文件末尾读取,并返回一个空字符串。
答案 3 :(得分:2)
该文件被截断,因此您可以调用read()
(不会引发异常,与使用'w'打开时不同)但是您将获得一个空字符串。
答案 4 :(得分:1)
我怀疑有两种方法可以处理我认为你想要实现的目标。
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)
希望这会有所帮助..
答案 5 :(得分:1)
两者看起来都一样,但是有一个陷阱。
r +:-
w +:-
因此,总的来说,这两者都是为了打开文件进行读取和写入,但不同之处在于我们是要在开始时擦除数据,然后进行读/写操作还是直接开始操作。
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
答案 6 :(得分:0)
实际上,关于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)覆盖它们。
答案 7 :(得分:0)
如h4z3所述, 为了实际使用 有时,您的数据太大而无法直接加载所有内容,或者您拥有生成器或实时传入的数据,则可以使用w +将其存储在文件中,以便以后读取。
答案 8 :(得分:0)
r
供阅读
w
进行写
r+
用于读/写(如果文件存在),否则引发异常
w+
用于删除原始内容,然后在文件存在的情况下进行读取/写入,否则创建文件
一些示例如下:
>>> with open("f1.txt","w") as f:
... f.write("abcd")
...
>>> with open("f1.txt","w+") as f:
... f.write("o")
... f.seek(0)
... print(f.readlines())
...
['o']
>>> with open("f1.txt","w+") as f:
... f.write("abcd")
...
>>> with open("f1.txt","r+") as f:
... f.write("o")
... f.seek(0)
... print(f.readlines())
...
['obcd']
r文件必须存在
>>> with open("f2.txt","r") as f:
... f.write("abcd")
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'f2.txt'
在读写之前先删除w
>>> with open("temp.txt", "r") as f:
... print(f.readlines())
...
['a\n', 'b\n', 'c\n', 'd\n']
>>> with open("temp.txt", "w+") as f:
... print(f.readlines())
...
[]
答案 9 :(得分:0)
以下列表可能会有所帮助
字符 含义
'r' - 打开以供阅读(默认)
'w' - 打开写入,先截断文件
'x' - 打开独占创建,如果文件已经存在则失败
'a' - 打开写入,如果文件存在则附加到文件末尾
'b' - 二进制模式
't' - 文本模式(默认)
'+' - 打开更新(读取和写入)
默认模式是'r'(打开阅读文本,'rt'的同义词)。模式 'w+' 和 'w+b' 打开并截断文件。模式 'r+' 和 'r+b' 可以不截断地打开文件。
答案 10 :(得分:0)
我也很困惑......但我的回答可能会对某人有所帮助。 我假设您想利用“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())