只读方式打开文件。文件指针放在文件的开头,这是默认模式。
以二进制格式只读方式打开文件。文件指针放在文件的开头,这是默认模式。
可读写方式打开文件。文件指针将位于文件开头。
以二进制格式可读写方式打开文件。文件指针将位于文件开头。
只写方式打开文件。如果文件存在,则覆盖文件。如果文件不存在,则创建一个新文件进行写入。
以二进制格式只写方式打开文件。如果文件存在,则覆盖文件。如果文件不存在,则创建一个新文件进行写入。
可读写方式打开文件。如果文件存在,则覆盖现有文件。如果文件不存在,则创建一个新文件进行读写。
以二进制格式可读写方式打开文件。如果文件存在,则覆盖现有文件。如果文件不存在,则创建一个新文件进行读写。
打开一个文件进行追加写入。如果文件存在,文件指针位于文件末尾,也就是说文件处于追加模式。如果文件不存在,它会创建一个新的文件进行写入。
ab
以二进制格式打开文件进行追加写入。如果文件存在,文件指针位于文件末尾,也就是说文件处于追加模式。如果文件不存在,它会创建一个新的文件进行写入。
a+
同时打开一个文件进行追加和读取操作。如果文件存在,文件指针位于文件末尾,文件以追加模式打开。如果文件不存在,它会创建一个新的文件进行读写操作。
ab+
同时以二进制格式打开一个文件进行追加和读取操作。如果文件存在,文件指针位于文件末尾,文件以追加模式打开。如果文件不存在,它会创建一个新的文件进行读写操作。
w+
会创建一个新文件或截断现有文件,然后打开它以供读写;r+
打开现有文件以供读写,但不会截断它。两者非常不同。 - abarnertr
、w
或a
是互斥的,但b
可以添加到其中任何一个,+
或U
也可以添加到其中任何一个……这是一种组合爆炸。 - rmunnrb
不是默认模式,引用原文:mode
最常用的值是'r'
表示读取,'w'
表示写入(如果文件已经存在则截断),而'a'
表示追加(在某些Unix系统上,所有写入都会追加到文件的末尾,无论当前的寻找位置在哪里)。如果省略了mode
参数,则默认为'r'
。https://docs.python.org/2/library/functions.html#open - iggyPython中的所有文件模式
r
读取文件r+
可读可写(不能截断文件)w
写入文件w+
可读可写(可以截断文件)rb
读取二进制文件。 文件指针放置在文件开头。rb+
读取或写入二进制文件wb+
写二进制文件a+
追加方式打开ab+
以追加和读取二进制方式打开文件。 如果文件存在,则文件指针位于文件末尾。文件以追加方式打开。x
独占创建,如果文件已存在则失败 (Python 3)rb
和wb
,更不用说2.x版本中的U
模式和3.x版本中的t
模式(这两种模式都可以与除了b
以外的所有模式组合使用)。 - abarnertwb+
是否也从文件中读取? - Celeritas假设你正在使用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+
打开一个文件时,它就是一个空文件:它不包含任何字节。如果它之前包含有数据,那么这些数据已经被截断、丢弃了,现在文件大小是0字节,所以在使用w+
打开文件之前的数据将无法读取。如果你希望读取以前的数据并添加新的数据,你应该使用r+
而不是w+
。 - rmunnr
表示读取文件。
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
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
输出
0
567
abcdefg
0987654
1234
abc.txt
- 运行后:
abcd567
abcdefg
0987654
1234Sunny
将 abc.txt 重置为初始状态
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
输出
0
abc.txt
- 运行后:
abcdSunny
r+
模式的答案都存在问题。
test.in
文件的内容:hello1
ok2
byebye3
而 Python 脚本的:
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.write(write_content)
之前执行 f.seek(0,0)
,write_content 将从位置 (0,0) 开始覆盖它们。# 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+
是用来做什么的? - Smart Manojread()
(不会引发异常,与使用“w”打开时不同),但是你会得到一个空字符串。以下是可能有帮助的列表
字符 含义
'r' - 打开以供阅读(默认)
'w' - 打开以供写入,首先截断文件
'x' - 打开以供独占创建,如果文件已经存在则失败
'a' - 打开以供写入,如果文件存在则将内容附加到文件末尾
'b' - 二进制模式
't' - 文本模式(默认)
'+' - 打开以供更新(读取和写入)
默认模式为“r”(打开文本进行阅读,与“rt”同义)。 模式“w +”和“w + b”打开并截断文件。 模式“r +”和“r + b”打开文件而不截断。
Reference:https://docs.python.org/3/library/functions.html#open
with open('somefile.txt', 'a+') as f:
f.seek(0)
for line in f:
print(f.readline())