open函数的注释(翻译)
def open(file, mode=‘r’, buffering=None, encoding=None, errors=None, newline=None, closefd=True):
-
打开文件并返回流。失败时引发错误。
-
file是一个文本或字节字符串(如果文件不在当前工作目录中,则为路径),给出要打开的文件的名称,或者是要包装的文件的整数文件描述符。(如果给定了文件描述符,则在关闭返回的I/O对象时关闭该描述符,除非closefd设置为False。)
-
mode是一个可选字符串,指定打开文件的模式。它默认为“r”,表示以文本模式打开进行读取。其他常用值有“w”表示写入(如果文件已存在,则会删除原先内容进行写入)、“x”表示创建并写入新文件,以及“a”表示追加(在某些Unix系统上,这意味着所有写入都追加到文件的末尾,而不考虑当前的查找位置)。在文本模式下,如果未指定编码,则使用的编码取决于平台:调用 locale.getpreferredencoding 以获取当前(区域)locale的编码。(对于读取和写入原始字节,请使用二进制模式,不指定编码。)可用的模式有:
综上所述,如果读取和写入的内容非 raw bytes(原始字节),那么请使用文本模式,且需要指定编码,默认是utf-8
- ‘r’ open for reading (default)
‘w’ open for writing, truncating the file first
‘x’ create a new file and open it for writing
‘a’ open for writing, appending to the end of the file if it exists
‘b’ binary mode
‘t’ text mode (default)
‘+’ open a disk file for updating (reading and writing)
‘U’ universal newline mode (deprecated)` - 默认模式为“rt”(打开以读取文本)。对于二进制随机读写,使用模式“w+b”并将文件截断为0字节(即覆盖写),而“r+b”打开文件而不截断。“x”模式类似“w”,但是如果文件已经存在,则引发“FileExistsError”
- Python区分以二进制模式和文本模式打开的文件,即使底层操作系统没有这样做。以二进制模式打开的文件(在mode参数后面加上“b”)返回内容是字节类型,而不进行任何解码。在文本模式下(默认的模式,或在模式参数后附加“t”时),返回内容是字符串类型,字节首先会被解码,以依赖于平台的编码或指定的编码(如果给定)
- “U”模式已被弃用,将在Python的未来版本中引发异常。它在python3中没有效果。使用换行符控制通用换行符模式
- 缓冲是用于设置缓冲策略的可选整数。传递0以关闭缓冲(仅在二进制模式下允许),传递1以选择行缓冲(仅在文本模式下可用),传递一个大于1的整数以指示缓冲区的大小。当没有给出缓冲参数时,默认缓冲策略的工作方式如下
- 二进制文件被缓冲在固定大小的块中;缓冲区的大小是使用一种启发式方法来选择的,这种启发式方法试图确定底层设备的“块大小”,然后返回
o.DEFAULT_BUFFER_SIZE
。在许多系统上,缓冲区通常为4096或8192字节长。 - “交互式”文本文件(isatty() 返回True的文件)使用行缓冲。其他文本文件使用上述策略对于二进制文件。
- encoding是用于解码或编码文件的编码的名称。只能在文本模式下使用。默认编码依赖于平台,但是可以传递Python支持的任何编码。有关支持的编码列表,请参见编解码器模块
- errors是一个可选字符串,指定如何处理编码错误——此参数不应在二进制模式下使用。如果存在编码错误,则传递’strict’以引发ValueError异常(默认值None具有相同的效果),或者传递’ignore’以忽略错误。(请注意,忽略编码错误可能会导致数据丢失)有关详细信息,请参阅codecs的文档或运行命令help(codecs.Codec)获取编码错误字符串列表。
- newline控制通用换行符的工作方式(它仅适用于文本模式)。它可以是None、“”、“\n”、“\r”和“\r\n”。其工作原理如下:
- 输入时,如果换行符为None,则启用通用换行符newlines 模式。输入中的行可以以’\n’、’\r’或’\r\n’结尾,这些行在返回给调用者之前被翻译成’\n’。如果是“”,则启用通用换行符newline模式,未翻译的行尾将返回给调用者。如果它具有任何其他合法值,则输入行仅以给定的字符串终止,行尾将返回给调用方,而不进行翻译
- 在输出时,如果newline为None,则写入的任何’\n’字符都将转换为系统默认的行分隔符,os.linesep. 如果换行符为“”或“\n”,则不进行转换。如果newline是任何其他合法值,则写入的任何’\n’字符都将转换为给定的字符串
- 如果closefd为False,则在关闭文件时,底层文件描述符将保持打开状态。当给定文件名时且closefd为True时,将不会如此
- A custom opener can be used by passing a callable as opener. The underlying file descriptor for the file object is then obtained by calling opener with (file, flags). opener must return an open file descriptor (passing os.open as opener results in functionality
similar to passing None) - open()返回一个file对象,该对象的类型取决于模式,并通过该对象执行标准文件操作,如读写。当open()用于以文本模式(‘w’、‘r’、‘wt’、'rt’等)打开文件时,它返回一个TextIOWrapper。当用于在二进制模式下打开文件时,返回的类会有所不同:在读二进制模式下,返回BufferedReader;在写二进制和附加二进制模式下,返回BufferedWriter;在读/写模式下,返回BufferedRandom
- 也可以使用string或bytearray作为文件进行读取和写入。对于字符串,可以使用fStringIO就像使用文本模式打开的文件一样,对于字节,可以使用BytesIO ,就像使用二进制模式打开文件一样。