open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
打开 file 并返回对应的 file object。 如果该文件不能被打开,则引发 OSError。 请参阅 读写文件 获取此函数的更多用法示例。
file 是一个 path-like object,表示将要打开的文件的路径(绝对路径或者相对当前工作目录的路径),也可以是要封装文件对应的整数类型文件描述符。(如果给出的是文件描述符,则当返回的 I/O 对象关闭时它也会关闭,除非将 closefd 设为 False 。)
mode 是一个指明文件打开模式的可选字符串。 它默认为 'r' 表示以文本模式读取。 其他常见模式有表示写入的 'w' (若文件已存在则将其清空),表示独占创建的 'x',以及表示追加写入的 'a' (在 某些 Unix 系统上,这意味着无论当前查找位置在哪里 所有 写入操作都将追加到文件末尾)。 在文本模式下,如果未指定 encoding 则所使用的编码格式将依赖于具体平台: locale.getencoding() 会被调用以获取当前语言区域的编码格式。 (对于读取和写入原始字节数据请使用二进制模式并且不要指定 encoding。) 可用的模式有:
字符 |
含意 |
|
读取(默认) |
|
写入,并先截断文件 |
|
排它性创建,如果文件已存在则失败 |
|
打开文件用于写入,如果文件存在则在末尾追加 |
|
二进制模式 |
|
文本模式(默认) |
|
打开用于更新(读取与写入) |
默认模式为 'r' (打开文件用于读取文本,与 'rt' 同义)。'w+' 和 'w+b' 模式将打开文件并清空内容。而 'r+' 和 'r+b' 模式将打开文件但不清空内容。
正如在 概述 中提到的,Python区分二进制和文本I/O。以二进制模式打开的文件(包括 mode 参数中的 'b' )返回的内容为 bytes 对象,不进行任何解码。在文本模式下(默认情况下,或者在 mode 参数中包含 't' )时,文件内容返回为 str ,首先使用指定的 encoding (如果给定)或者使用平台默认的的字节编码解码。
备注
Python不依赖于底层操作系统的文本文件概念;所有处理都由Python本身完成,因此与平台无关。
buffering 是一个可选的整数,用于设置缓冲策略。 传入 0 来关闭缓冲(仅在二进制模式下允许),传入 1 来选择行缓冲(仅在文本模式下写入时可用),传一个整数 > 1 来表示固定大小的块缓冲区的字节大小。 注意这样指定缓冲区的大小适用于二进制缓冲的 I/O,但 TextIOWrapper (即用 mode='r+' 打开的文件) 会有另一种缓冲。 要禁用 TextIOWrapper 中的缓冲,请考虑为 io.TextIOWrapper.reconfigure() 使用 write_through 旗标。 当没有给出 buffering 参数时,默认的缓冲策略规则如下:
- 二进制文件以固定大小的块进行缓冲;缓冲区的大小是使用启发方式来尝试确定底层设备的“块大小”并会回退至 io.DEFAULT_BUFFER_SIZE。 在许多系统上,缓冲区的长度通常为 4096 或 8192 字节。
- “交互式”文本文件( isatty() 返回 True 的文件)使用行缓冲。其他文本文件使用上述策略用于二进制文件。
encoding 是用于编码或编码文件的编码格式名称。 这应当只有文本模式下使用。 默认的编码格式依赖于具体平台 (即 locale.getencoding() 所返回的值),但是任何 Python 支持的 text encoding 都可以被使用。 请参阅 codecs 模块获取受支持的编码格式列表。
errors 是一个可选的字符串参数,用于指定如何处理编码和解码错误 - 这不能在二进制模式下使用。可以使用各种标准错误处理程序(列在 错误处理方案 ),但是使用 codecs.register_error() 注册的任何错误处理名称也是有效的。标准名称包括:
- 如果存在编码错误,'strict' 会引发 ValueError 异常。 默认值 None 具有相同的效果。
- 'ignore' 忽略错误。请注意,忽略编码错误可能会导致数据丢失。
- 'replace' 会将替换标记(例如 '?' )插入有错误数据的地方。
- 'surrogateescape' 将把任何不正确的字节表示为 U+DC80 至 U+DCFF 范围内的下方替代码位。 当在写入数据时使用 surrogateescape 错误处理器时这些替代码位会被转回到相同的字节。 这适用于处理具有未知编码格式的文件。
- 'xmlcharrefreplace' 仅在写入文件时才受到支持。 编码格式不支持的字符将被替换为相应的 XML 字符引用 &#nnn;。
- 'backslashreplace' 用Python的反向转义序列替换格式错误的数据。
- 'namereplace' (也只在编写时支持)用 \N{...} 转义序列替换不支持的字符。
newline 决定如何解析来自流的换行符。 它可以为 None, '', '\n', '\r' 和 '\r\n'。 它的工作原理如下:
- 从流中读取输入时,如果 newline 为 None,则启用通用换行模式。输入中的行可以以 '\n','\r' 或 '\r\n' 结尾,这些行被翻译成 '\n' 在返回呼叫者之前。如果它是 '',则启用通用换行模式,但行结尾将返回给调用者未翻译。如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且行结尾将返回给未调用的调用者。
- 将输出写入流时,如果 newline 为 None,则写入的任何 '\n' 字符都将转换为系统默认行分隔符 os.linesep。如果 newline 是 '' 或 '\n',则不进行翻译。如果 newline 是任何其他合法值,则写入的任何 '\n' 字符将被转换为给定的字符串。
如果 closefd 为 False 且给出的不是文件名而是文件描述符,那么当文件关闭时,底层文件描述符将保持打开状态。如果给出的是文件名,则 closefd 必须为 True (默认值),否则将触发错误。
可以通过传递可调用的 opener 来使用自定义开启器。然后通过使用参数( file,flags )调用 opener 获得文件对象的基础文件描述符。 opener 必须返回一个打开的文件描述符(使用 os.open as opener 时与传递 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) # don't leak a file descriptor
open() 函数所返回的 file object 类型取决于所用模式。 当使用 open() 以文本模式 ('w', 'r', 'wt', 'rt' 等) 打开文件时,它将返回 io.TextIOBase (具体为 io.TextIOWrapper) 的一个子类。 当使用缓冲以二进制模式打开文件时,返回的类是 io.BufferedIOBase 的一个子类。 具体的类会有多种:在只读的二进制模式下,它将返回 io.BufferedReader;在写入二进制和追加二进制模式下,它将返回 io.BufferedWriter,而在读/写模式下,它将返回 io.BufferedRandom。 当禁用缓冲时,则会返回原始流,即 io.RawIOBase 的一个子类 io.FileIO。