模式 | 意义 | 注意事项 |
---|---|---|
r | 只读模式打开文件,读文件内容的指针会放在文件的开头。 | 操作的文件必须存在。 |
rb | 以二进制格式、采用只读模式打开文件,读文件内容的指针位于文件的开头,一般用于非文本文件,如图片文件、音频文件等。 | |
r+ | 打开文件后,既可以从头读取文件内容,也可以从开头向文件中写入新的内容,写入的新内容会覆盖文件中等长度的原有内容。 | |
rb+ | 以二进制格式、采用读写模式打开文件,读写文件的指针会放在文件的开头,通常针对非文本文件(如音频文件)。 | |
w | 以只写模式打开文件,若该文件存在,打开时会清空文件中原有的内容。 | 若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。 |
wb | 以二进制格式、只写模式打开文件,一般用于非文本文件(如音频文件) | |
w+ | 打开文件后,会对原有内容进行清空,并对该文件有读写权限。 | |
wb+ | 以二进制格式、读写模式打开文件,一般用于非文本文件 | |
a | 以追加模式打开一个文件,对文件只有写入权限,如果文件已经存在,文件指针将放在文件的末尾(即新写入内容会位于已有内容之后);反之,则会创建新文件。 | |
ab | 以二进制格式打开文件,并采用追加模式,对文件只有写权限。如果该文件已存在,文件指针位于文件末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 | |
a+ | 以读写模式打开文件;如果文件存在,文件指针放在文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 | |
ab+ | 以二进制模式打开文件,并采用追加模式,对文件具有读写权限,如果文件存在,则文件指针位于文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 |
图 2 中,将以上几个容易混淆的文件打开模式的功能做了很好的对比:总结如下:
- r 表示从文件表读取
- w 表示写入文件
- a 表示追加写入
- b 表示以二进制方式操作文件
- + 表示可读写文件
文件打开模式,直接决定了后续可以对文件做哪些操作。例如,使用 r 模式打开的文件,后续编写的代码只能读取文件,而无法修改文件内容。
FileNotFoundError Traceback (most recent call last)
<ipython-input-4-dad991fb07c9> in <module>
----> 1 file=open("a.txt")
2 print(file)
FileNotFoundError: [Errno 2] No such file or directory: 'a.txt'
现在,在程序文件同目录下,手动创建一个 a.txt 文件,并再次运行该程序,其运行结果为:
<_io.TextIOWrapper name='a.txt' mode='r' encoding='cp936'>
可以看到,当前输出结果中,输出了 file 文件对象的相关信息,包括打开文件的名称、打开模式、打开文件时所使用的编码格式。file = open("a.txt",encoding="utf-8")
注意,手动修改 encoding 参数的值,仅限于文本文件的形式打开,也就是说,以二进制格式打开时,不能对 encoding 参数的值做任何修改,否则程序会抛出 ValueError 异常,如下所示:ValueError: binary mode doesn't take an encoding argument
为什么呢?原因很简单,目前为止计算机内存的 I/O 速度仍远远高于计算机外设(例如键盘、鼠标、硬盘等)的 I/O 速度,如果不使用缓冲区,则程序在执行 I/O 操作时,内存和外设就必须进行同步读写操作,也就是说,内存必须等待外设输入(输出)一个字节之后,才能再次输出(输入)一个字节。这意味着,内存中的程序大部分时间都处于等待状态。果 buffering 参数值为大于 1 的整数,该整数用于指定缓冲区的大小(单位是字节);如果 buffering 参数的值为负数,则代表使用默认的缓冲区大小。
False
r
cp936
my_file.txt
注意,使用 open() 函数打开的文件对象,必须手动进行关闭python 垃圾回收机制无法自动回收打开文件所占用的资源。
file.close()
其中,file 表示已打开的文件对象。 Traceback (most recent call last):
File "C:\Users\mengma\Desktop\demo.py", line 4, in <module>
os.remove("my_file.txt")
PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: 'my_file.txt'
- f = open("my_file.txt", 'w')
- f.write("http://c.biancheng.net/shell/")
f = open("my_file.txt", 'w') f.write("http://c.biancheng.net/shell/")程序执行后,虽然 Python 解释器不报错,但打开 my_file.txt 文件会发现,根本没有写入成功。这是因为,在向以文本格式(而不是二进制格式)打开的文件中写入数据时,Python 出于效率的考虑,会先将数据临时存储到缓冲区中,只有使用 close() 函数关闭文件时,才会将缓冲区中的数据真正写入文件中。
with 表达式 [as target]:
代码块
C语言中文网
http://c.biancheng.net
- with open('a.txt', 'a') as f:
- f.write("\nPython教程")
with open('a.txt', 'a') as f: f.write("\nPython教程")运行结果为:
C语言中文网
http://c.biancheng.net
Python教程
with open("a.txt") as fr,open("b.txt",mode="w") as fw:可以看到,通过使用 with as 语句,即便最终没有关闭文件,修改文件内容的操作也能成功。
fw.writelines(fr.readlines( )) with open("a.txt") as fr:
with open("b.txt",mode="w") as fw:
fw.writelines(fr.readlines( ))
(了解)简单的理解,同时包含 __enter__() 和 __exit__() 方法的对象就可以使用with as上下文管理器。文件对象内部实现了__enter__() 和 __exit__() 方法
- __enter__(self):进入上下文管理器自动调用的方法,该方法会在 with as 代码块执行之前执行。如果 with 语句有 as子句,那么该方法的返回值会被赋值给 as 子句后的变量;该方法可以返回多个值,因此在 as 子句后面也可以指定多个变量(多个变量必须由“()”括起来组成元组)。
- __exit__(self, exc_type, exc_value, exc_traceback):退出上下文管理器自动调用的方法。该方法会在 with as 代码块执行之后执行。如果 with as 代码块成功执行结束,程序自动调用该方法,调用该方法的三个参数都为 None:如果 with as 代码块因为异常而中止,程序也自动调用该方法,使用 sys.exc_info 得到的异常信息将作为调用该方法的参数。