因为该函数的官方参考手册引文篇幅过大,不再本文中体现,本文的内容均翻译自官方手册,如有需要查询原引文内容的,详见官方手册。另外,本文中涉及的链接,会在发布相应的文章后陆续进行补充。
参数形式
open(file, mode=’r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数使用说明
打开发文件并返回相应的文件对象,如果文件不能打开,则引发OSError异常。
file
file可以是字符串或字节对象,用于给出要打开文件路径名(绝对或相对当前工作目录)或要打包文件的整数文件描述符。如果给定某个文件描述符,当返回的I/O对象关闭时那么它会被关闭,除非closefd设为False。
mode
mode是一个可选的字符串参数,用来指定文件打开模式。默认值为’r’,表示以文本模式只读打开。其他常用值有:’w’可写(若文件已经存在则截断),’x’单独创建,’a’添加(在一些Unix系统上,这意味着不管当前查找位置,所有写入添加到文件尾部)。在文本模式下,如果没有指定编码,那么编码的使用依赖于平台:调用locale.getpreferredencoding(False)来获取当前本地编码(对于读写原始字节,使用二进制模式,且不用指定编码)。可用的mode有:
| 字符 | 含义 |
|---|---|
| ‘r’ | 只读打开(默认) |
| ‘w’ | 写入打开,首先截断文件 |
| ‘x’ | 单独创建打开,如果文件已存在则失败 |
| ‘a’ | 写入打开,如果文件存在则添加到尾部 |
| ‘b’ | 二进制模式 |
| ‘t’ | 文本模式(默认) |
| ‘+’ | 更新方式(读、写)打开磁盘文件 |
| ‘U’ | 通用换行模式(已过时) |
默认模式’r’(只读打开,等同于’rt’)。对于二进制读写访问,’w+b’模式打开,并将文件截断为0字节。’r+b’不截断打开文件。
Python区分二进制和文本I/O。文件以二进制模式打开(mode参数含’b’),不进行任何解码,将内容以bytes对象返回。在文本模式下(默认,或mode参数含’t’),返回的文件内容是str,将使用平台依赖的编码或指定编码首先对字节进行解码。
注意:Python不依赖底层操作系统的文本文件概念,所有的处理有Python自身完成,因此是具有平台独立性的。
buffering
buffering是一个整数可选项,用于设置缓冲策略,传入0关闭缓冲(仅允许在二进制模式下),1选择行缓冲(尽用于文本模式),大于1的整数用于指示某个固定大小的块缓冲区的字节大小。当没有给定buffering参数时,默认缓冲策略运行如下:
- 二进制文件在固定大小的块内缓冲,缓冲区大小的选择,会使用启发式的方法来尝试决定底层设备的“块尺寸“,并退回至io.DEFAULT_BUFFER_SIZE。在很多系统上,缓冲区通常的字长是4096或8192。
- ”交互式“文本文件(对于isatty()返回True的文件)使用行缓冲,其他文本文件使用的策略与上面二进制文件的相同。
encoding
encoding是用于编码或解码文件的编码名称。该参数应仅用于文本模式,默认的编码是平台依赖的(无论locale.getpreferredencoding()返回什么),但所有Python支持的文本编码都可使用,支持的编码列表参考codecs模块。
errors
errors是一个字符串可选项,用于指定如何操作编、解码的错误(不能用于二进制模式)。目前能找到各种的标准错误处理程序(在错误处理程序中列出),然而用codecs.register_error()注册的所有错误处理名也有效,这些标准名称包括:
- ‘strict’,如果有编码错误,引发ValueError异常, 默认值None有同样效果。
- ‘ignore’ ,忽略错误。注意:忽略编码错误可能导致数据丢失。
- ‘replace’,会导致在出现畸形数据的地方插入替代符号(例如’?’)。
- ‘surrogateescape’ ,会将任何不正确的字节以Unicode Private Use Area(区间U+DC80到U+DCFF)中的代码点表示。当写入数据时,若使用surrogateescape错误处理程序,这些私有代码点随后会转化回相同的字节,这对于处理未知编码文件非常有用。
- ‘xmlcharrefreplace’ 只支持写入文件,编码不支持的字符会用适当的XML字符引用&#nnn;进行替换。
- ‘backslashreplace’ 可以用Python的反斜杠转义序列替换畸形数据。
- ‘namereplace’ (仅支持写入),用\N{…}转义序列替换不支持的字符。
newline
newline控制通用换行模式如何运行(只支持文本模式),该值可以是None, ”, ‘\n’、’\r’和’\r\n’,以如下方式运行:
- 当从流读取输入时,如果newline值为None,通用换行模式启用,输入中的行尾可以是’\n’、’\r’或’\r\n’,这些会在返回给调用者前转换为’\n’;如果参数值是”,通用换行模式启用,但是行尾不做转换返回给调用者;如果它有任意其他合法值,输入行以给定字符串结束,行尾不做转换返回给调用者。
- 当把输出写入到流时,如果newline值为None,任意写入的’\n’将转换为系统默认的行分隔符(详见os.linesep);如果newline值为”或’\n’,不进行转换;如果newline值为其他任意合法值,所有写入的’\n’字符将转换为给定字符串。
closefd
如果closefd为False,且给定文件描述符(而不是文件名),那么当文件关闭时底层文件描述符将保持打开。如果给定文件名,closefd必须为True(默认)。否则将引发错误。
opener
opener可以传递调用一个自定义打开器,然后通过调用opener获取文件对象的底层文件描述符。opener必须返回一个打开文件描述符(传递os.open与传递None产生的功能相似)。
新创建的文件是非继承的。
相较一个给定的目录,以下的实例使用了os.open()函数的dir_fd参数来打开一个文件:
>>>
>>> import os
>>> dir_fd = os.open('somedir', os.O_RDONLY)
>>> def opener(path, flags):
... return os.open(path, flags, dir_fd=dir_fd)
...
>>> with open('spamspam.txt', 'w', opener=opener) as f:
... print('This will be written to somedir/spamspam.txt', file=f)
...
>>> os.close(dir_fd) # 不要泄露文件描述符
其他
open()函数返回的文件对象类型依赖于mode:
- 当open()以文本模式(’w’, ‘r’, ‘wt’, ‘rt’, etc.)打开一个文件时,它返回io.TextIOBase(特殊形式为io.TextIOWrapper)的一个子类;
当用缓冲以二进制模式打开一个文件时,返回的类是io.BufferedIOBase的一个子类,确切的类差异情况包括:
- 在只读二进制模式下,它返回io.BufferedReader;
- 在可写和添加二进制模式下,它返回io.BufferedWriter;
当禁用缓冲时,返回原始流、io.RawIOBase的子类和io.FileIO
可以参考其他的文件处理模块,例如:fileinput、io (声明open()的类)、os、os.path、tempfile和shutil。
版本变更内容
version 3.3变更: 增加opener参数 ;增加’x’模式;以往IOError异常现更名为OSError;现在如果以单独创建模式(’x’)打开的文件已经存在的话,将引发FileExistsError。
version 3.4变更: 文件现在是非继承的了。
从version 3.4开始不建议的,且将会在version 4.0移除的内容: ‘U’模式。
version 3.5变更: 如果系统调用中断,且信号处理程序没有引发异常,那么现在该函数将重试系统调用(替代引发InterruptedError异常)。
version 3.5变更: 增加’namereplace’错误处理程序。
拓展阅读
文件对象
bytes
str
io.DEFAULT_BUFFER_SIZE
isatty()
locale.getpreferredencoding()
codecs
错误处理程序
codecs.register_error()
os.linesep
os.open
io.TextIOBase
io.TextIOWrapper
io.BufferedIOBase
io.BufferedReader
io.BufferedWriter
io.BufferedRandom
io.RawIOBase
io.FileIO
fileinput
io
os
os.path
tempfile
shutil
本文详细介绍了Python的内建函数open(),包括其参数如file、mode、buffering、encoding等的使用说明,以及不同模式下文件对象的类型。open()函数用于打开文件,并返回文件对象,如果不指定编码,文本模式将使用平台依赖的编码。同时,文章提到了open()函数在不同Python版本中的变更和拓展阅读资源。
1101





