提问人:holys 提问时间:4/25/2013 更新时间:7/14/2021 访问量:475804
被 python 文件模式“w+”[重复] 弄糊涂了
Confused by python file mode "w+" [duplicate]
问:
从文档中,
模式“r+”、“w+”和“a+”打开文件进行更新(请注意,“w+”会截断文件)。在区分二进制文件和文本文件的系统上,将“b”附加到以二进制模式打开文件的模式;在没有这种区别的系统上,添加“b”不起作用。
和这里
w+ :打开一个文件进行写入和读取。如果现有文件存在,则覆盖该文件。如果该文件不存在,则创建一个用于读取和写入的新文件。
但是,如何读取用 ?w+
答:
文件被截断,因此您可以调用(不会引发异常,这与使用“w”打开时不同),但您会得到一个空字符串。read()
假设您正在打开文件,并带有应有的语句。然后,您可以执行如下操作来读取文件中的内容: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()
评论
w+
w+
w+
r+
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+
Python 中的所有文件模式
r
供阅读r+
打开进行读取和写入(无法截断文件)w
用于写作w+
用于写入和读取(可以截断文件)rb
用于读取二进制文件。文件指针位于文件的开头。rb+
读取或写入二进制文件wb+
编写二进制文件a+
打开以追加ab+
打开一个文件,以二进制形式追加和读取。如果文件存在,则文件指针位于文件的末尾。文件将在追加模式下打开。x
打开以独占方式创建,如果文件已存在,则失败 (Python 3)
评论
rb
wb
U
t
b
wb+
以下是打开文件的不同模式的列表:
r
打开仅供读取的文件。文件指针位于文件的开头。这是默认模式。
RB型
打开仅供二进制格式读取的文件。文件指针位于文件的开头。这是默认模式。
R+系列
打开一个文件进行读取和写入。文件指针将位于文件的开头。
RB+(RB+)
以二进制格式打开用于读取和写入的文件。文件指针将位于文件的开头。
w
打开仅供写入的文件。如果文件存在,则覆盖该文件。如果该文件不存在,请创建一个新文件进行写入。
工 务 局
打开仅以二进制格式写入的文件。如果文件存在,则覆盖该文件。如果该文件不存在,请创建一个新文件进行写入。
W+系列
打开文件以进行写入和读取。如果现有文件存在,则覆盖该文件。如果该文件不存在,则创建一个用于读取和写入的新文件。
免疫印迹 +
以二进制格式打开文件进行写入和读取。如果现有文件存在,则覆盖该文件。如果该文件不存在,则创建一个用于读取和写入的新文件。
一个
打开要追加的文件。如果文件存在,则文件指针位于文件的末尾。也就是说,文件处于追加模式。如果该文件不存在,它将创建一个新文件进行写入。
血型
打开一个文件以二进制格式追加。如果文件存在,则文件指针位于文件的末尾。也就是说,文件处于追加模式。如果该文件不存在,它将创建一个新文件进行写入。
A+级
打开文件以进行追加和读取。如果文件存在,则文件指针位于文件的末尾。文件将在追加模式下打开。如果该文件不存在,它将创建一个用于读取和写入的新文件。
AB+(英语:AB
以二进制格式打开用于追加和读取的文件。如果文件存在,则文件指针位于文件的末尾。文件将在追加模式下打开。如果该文件不存在,它将创建一个用于读取和写入的新文件。
评论
w+
r+
r
w
a
b
+
U
rb
不是默认模式,引用:docs.python.org/2/library/functions.html#openThe most commonly-used values of mode are 'r' for reading, 'w' for writing (truncating the file if it already exists), and 'a' for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position). If mode is omitted, it defaults to 'r'
实际上,所有其他关于模式的答案都有问题。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()
顺便说一句,如果我们之前 ,write_content将从 positon(0,0) 覆盖它们。f.seek(0,0)
f.write(write_content)
正如 h4z3 所提到的, 为了实际使用, 有时你的数据太大而无法直接加载所有内容,或者你有一个生成器,或者实时传入的数据,你可以使用 w+ 存储在文件中并稍后读取。
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+ :-
- 打开文件进行读取和写入
- 一旦在开始文件中打开,指针将指向 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
以下是可能会有所帮助的列表
字符含义
'r' - 打开阅读(默认)
'w' - 打开进行写入,首先截断文件
“x” - 打开以独占方式创建,如果文件已存在,则失败
'a' - 打开以供写入,如果存在,则追加到文件末尾
'b' - 二进制模式
't' - 文本模式(默认)
'+' - 打开更新(读取和写入)
默认模式为“r”(打开用于阅读文本,“rt”的同义词)。模式“w+”和“w+b”打开并截断文件。模式“r+”和“r+b”打开文件时不会截断。
编号:https://docs.python.org/3/library/functions.html#open
我也很困惑......但也许我的答案会帮助某人。 我假设您想利用“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())
评论