对python文件模式“w+”感到困惑[重复]
- 2024-12-09 08:30:00
- admin 原创
- 209
问题描述:
从文档中,
模式“r+”、“w+”和“a+”打开文件进行更新(请注意,“w+”会截断文件)。在区分二进制文件和文本文件的系统上,将“b”附加到模式以二进制模式打开文件;在没有这种区别的系统上,添加“b”不起作用。
这里
w+ :打开一个文件进行读写。如果文件存在,则覆盖现有文件。如果文件不存在,则创建一个新文件进行读写。
但是,如何读取用打开的文件w+
?
解决方案 1:
以下是打开文件的不同模式的列表:
r
=
打开文件仅供读取。文件指针位于文件开头。这是默认模式。
rb
以二进制格式打开文件以供只读。文件指针位于文件开头。这是默认模式。
r+
打开一个文件进行读写。文件指针将位于文件的开头。
rb+
以二进制格式打开文件以供读取和写入。文件指针将位于文件的开头。
瓦
=
打开一个文件仅供写入。如果文件存在,则覆盖该文件。如果文件不存在,则创建一个新文件供写入。
西伯利亚
以二进制格式打开一个文件,仅用于写入。如果文件存在,则覆盖该文件。如果文件不存在,则创建一个新文件进行写入。
w+
打开一个文件进行读写。如果文件存在,则覆盖现有文件。如果文件不存在,则创建一个新文件进行读写。
韓國
以二进制格式打开文件进行写入和读取。如果文件存在,则覆盖现有文件。如果文件不存在,则创建一个新文件进行读取和写入。
一个
打开文件进行追加。如果文件存在,则文件指针位于文件末尾。也就是说,文件处于追加模式。如果文件不存在,则创建一个新文件进行写入。
AB
以二进制格式打开文件进行追加。如果文件存在,则文件指针位于文件末尾。也就是说,文件处于追加模式。如果文件不存在,则创建一个新文件进行写入。
a+
打开文件以进行追加和读取。如果文件存在,则文件指针位于文件末尾。文件以追加模式打开。如果文件不存在,则创建一个新文件以供读取和写入。
AB+
以二进制格式打开文件以进行追加和读取。如果文件存在,则文件指针位于文件末尾。文件以追加模式打开。如果文件不存在,则创建一个新文件以供读取和写入。
解决方案 2:
Python 中的所有文件模式
r
阅读r+
打开以进行读写(不能截断文件)w
用于写作w+
用于写入和读取(可以截断文件)rb
用于读取二进制文件。文件指针位于文件的开头。rb+
读取或写入二进制文件wb+
写入二进制文件a+
打开以附加ab+
打开文件以附加和读取二进制文件。如果文件存在,则文件指针位于文件末尾。文件以附加模式打开。x
打开以进行独占创建,如果文件已存在则失败(Python 3)
解决方案 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
')
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
'
注意f.seek(0)
——如果您忘记了这一点,调用f.read()
将尝试从文件末尾读取,并返回一个空字符串。
解决方案 4:
r
用于读取
w
用于写入
r+
如果文件存在则进行读/写而不删除原始内容,否则引发异常
w+
删除原始内容,如果文件存在则读/写,否则创建文件
例如,
>>> with open("file1.txt", "w") as f:
... f.write("ab
")
...
>>> with open("file1.txt", "w+") as f:
... f.write("c")
...
$ cat file1.txt
c$
>>> with open("file2.txt", "r+") as f:
... f.write("ab
")
...
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
")
...
>>> with open("file2.txt", "r+") as f:
... f.write("c")
...
$ cat file2.txt
cb
$
解决方案 5:
两者的工作原理似乎相同,但是有一个问题。
r+:-
打开文件进行读写
一旦打开,文件指针将指向 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
解决方案 6:
该文件被截断,因此您可以调用read()
(不会引发异常,与使用“w”打开时不同)但您会得到一个空字符串。
解决方案 7:
我认为有两种方法可以处理您想要实现的目标。
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)
希望这有帮助。
解决方案 8:
实际上,有关模式的其他所有答案都存在问题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)覆盖它们。
解决方案 9:
以下列表可能会有所帮助
字符 含义
'r'-打开以进行读取(默认)
'w' - 打开进行写入,首先截断文件
'x' - 打开以进行独占创建,如果文件已存在则失败
'a' - 打开以进行写入,如果文件存在则附加到文件末尾
‘b’-二进制模式
‘t’-文本模式(默认)
'+'-打开以进行更新(读取和写入)
默认模式为“r”(打开以读取文本,与“rt”同义)。模式“w+”和“w+b”打开并截断文件。模式“r+”和“r+b”打开文件但不截断。
参考:https://docs.python.org/3/library/functions.html#open
解决方案 10:
我也很困惑...但也许我的回答会对某些人有所帮助。我假设您想利用“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())
解决方案 11:
正如h4z3所述,就实际用途而言,有时您的数据太大而无法直接加载所有内容,或者您有一个生成器或实时传入数据,您可以使用 w+ 存储在文件中并稍后读取。