从文档中,
模式“r+”、“w+”和“a+”打开文件进行更新(注意“w+”会截断文件)。在区分二进制文件和文本文件的系统上,将“b”附加到模式以二进制模式打开文件;在没有这种区别的系统上,添加“b”没有效果。
在这里
w+ :打开一个文件进行读写。如果文件存在,则覆盖现有文件。如果文件不存在,则创建一个新文件进行读写。
但是,如何读取打开的文件w+
?
打开一个只读文件。文件指针位于文件的开头。这是默认模式。
以二进制格式打开一个只读文件。文件指针位于文件的开头。这是默认模式。
打开一个文件进行读写。文件指针将位于文件的开头。
以二进制格式打开一个文件进行读写。文件指针将位于文件的开头。
打开一个仅用于写入的文件。如果文件存在,则覆盖文件。如果文件不存在,则创建一个新文件进行写入。
打开一个仅以二进制格式写入的文件。如果文件存在,则覆盖文件。如果文件不存在,则创建一个新文件进行写入。
打开一个文件进行写入和读取。如果文件存在,则覆盖现有文件。如果文件不存在,则创建一个新文件进行读写。
打开一个文件以二进制格式写入和读取。如果文件存在,则覆盖现有文件。如果文件不存在,则创建一个新文件进行读写。
打开要追加的文件。如果文件存在,则文件指针位于文件末尾。也就是说,文件处于附加模式。如果文件不存在,它会创建一个新文件进行写入。
打开一个文件以二进制格式追加。如果文件存在,则文件指针位于文件末尾。也就是说,文件处于附加模式。如果文件不存在,它会创建一个新文件进行写入。
打开一个文件以进行追加和读取。如果文件存在,则文件指针位于文件末尾。该文件以附加模式打开。如果该文件不存在,则创建一个新文件进行读写。
以二进制格式打开一个文件以进行追加和读取。如果文件存在,则文件指针位于文件末尾。该文件以附加模式打开。如果该文件不存在,则创建一个新文件进行读写。
Python中的所有文件模式
r
用于阅读r+
打开读写(不能截断文件)w
写作 w+
用于写入和读取(可以截断文件)rb
用于读取二进制文件。文件指针位于文件的开头。rb+
读取或写入二进制文件wb+
写一个二进制文件a+
打开以追加ab+
打开一个文件以附加和读取二进制文件。如果文件存在,则文件指针位于文件末尾。该文件以附加模式打开。x
打开以进行独占创建,如果文件已存在则失败(Python 3)假设您正在使用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()
调用将尝试从文件末尾读取,并将返回一个空字符串。
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
$
两者似乎工作相同,但有一个问题。
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
该文件被截断,因此您可以调用read()
(不引发异常,与使用 'w' 打开时不同),但您会得到一个空字符串。
我怀疑有两种方法可以处理我认为您想要实现的目标。
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
文件内容:</p>
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) 开始覆盖它们。
这是列表可能会有所帮助
字符 含义
'r' - 打开阅读(默认)
'w' - 打开写入,首先截断文件
'x' - 打开以独占创建,如果文件已存在则失败
'a' - 打开写入,如果存在则附加到文件末尾
'b' - 二进制模式
't' - 文本模式(默认)
'+' - 打开更新(读取和写入)
默认模式是“r”(打开阅读文本,“rt”的同义词)。模式“w+”和“w+b”打开并截断文件。模式 'r+' 和 'r+b' 打开文件时不会被截断。
我也很困惑......但可能是我的回答会帮助某人。我假设您想利用 'w+' 模式的能力来创建文件(如果文件不存在)。
实际上,如果文件不存在,则只有 w、w+、a、a+ 可以创建。
但是,如果您需要读取文件的数据(带有数据的文件确实存在的情况),您不能使用 w+ 开箱即用,因为它会截断文件。糟糕,你不是那个意思!
因此,您最好的朋友可能是带有 file.seek(0) 的 a+:
with open('somefile.txt', 'a+') as f:
f.seek(0)
for line in f:
print(f.readline())
正如h4z3 所说,对于实际使用,有时您的数据太大而无法直接加载所有内容,或者您有生成器,或者实时传入数据,您可以使用 w+ 存储在文件中并稍后读取。