open(file, mode=‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
mode
r
open for reading in text mode(default)w
open for writing, truncating(截断) the file firstx
open for exclusive(独占) creation, failing if the file already existsa
open for writing, appending to the end of the file if it existsb
binary modet
text mode (default)+
open a disk file for updating (reading and writing)
默认模式为r
(打开以读取文本,rt
的同义词)。 对于二进制读写访问,模式w+b
打开并将文件截断为0字节。 r+b
打开文件而不截断。
如概述中所述,Python区分二进制和text I/O. 以二进制模式打开的文件(包括mode参数中的’b’)将内容作为字节对象返回,而不进行任何解码。 在text模式下(默认情况下,或者当t
包含在mode参数中时),文件的内容将返回为str,字节首先使用平台相关编码进行解码,或者使用指定的编码(如果给定)
允许使用额外的模式字符U
,它不再具有任何效果,并且被视为已弃用。它以前在文本模式下启用了通用换行符,这成为Python 3.0中的默认行为。有关更多详细信息,请参阅newline参数的文档。
注意Python不依赖于底层操作系统的文本文件概念;所有处理都由Python本身完成,因此与平台无关。
buffering
buffering是一个可选的整数参数,用于设置缓冲策略。传递0表示关闭缓冲(仅允许在二进制模式下),1表示行缓冲(仅在文本模式下可用),并且整数>1以指示固定大小的块缓冲区的大小(以字节为单位)。如果没有给出缓冲参数,则默认缓冲策略的工作方式如下:
- 二进制文件以固定大小的块缓冲;默认buffer大小由io.DEFAULT_BUFFER_SIZE确定。在许多系统上,缓冲区通常为4096或8192字节长。
- “交互式”文本文件(isatty()返回True的文件)使用行缓冲。其他文本文件使用上述策略用于二进制文件。
encoding
encoding是用于解码或编码文件的编码的名称。这应该只在文本模式下使用。默认编码取决于平台(无论locale.getpreferredencoding()返回什么),但可以使用Python支持的任何文本编码。有关支持的编码列表,请参阅编解码器模块。
errors
errors是一个可选字符串,指定如何处理编码和解码错误 - 这不能在二进制模式下使用。可以使用各种标准错误处理程序(在错误处理程序下列出),但已在codecs.register_error()中注册的任何错误处理名称也是有效的。标准名称包括:
strict
如果存在编码错误,则引发ValueError异常。默认值None具有相同的效果。
ignore
忽略错误。请注意,忽略编码错误可能会导致数据丢失。
replace
导致在有错误数据的地方插入替换标记(例如’?’)。
surrogateescape
将表示任何不正确的字节,作为Unicode专用区中的代码点,范围从U + DC80到U + DCFF。当在写入数据时使用surrogateescape错误处理程序时,这些私有代码点将被转回到相同的字节中。这对于处理未知编码的文件很有用。
xmlcharrefreplace
只有在写入文件时才支持。编码不支持的字符将替换为相应的XML字符引用&#nnn;
。
backslashreplace
用Python的反向转义序列替换格式错误的数据。
namereplace
(也仅在写入时支持)用\N {...}
转义序列替换不支持的字符。
newline
换行符(newline)控制通用换行模式的工作方式(仅适用于文本模式)。它可以是None
,``,\n
,\r
和 \r\n
。它的工作原理如下:
- 从流中读取输入时,如果换行为
None
,则启用通用换行模式。输入中的行可以以\n
,\r
或\r\n
结尾,并且在返回给调用者之前将这些行转换为\n
。如果是``,则启用通用换行模式,但行结尾将返回到未翻译的调用者。如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且行结尾将返回给未调用的调用者。 - 将输出写入流时,如果换行为None,则写入的任何“\n”字符都将转换为系统默认行分隔符
os.linesep
。如果换行符是``或\n
,则不会进行翻译。如果换行符是任何其他合法值,则写入的任何“\n”字符都将转换为给定的字符串。
closefd
如果closefd为False并且给出了文件描述符而不是文件名,则在关闭文件时,底层文件描述符将保持打开状态。如果给出文件名,则closefd必须为True(默认值),否则将引发错误。
opener
通过传递可调用的opener可以使用自定义opener。然后通过使用(file,flags)调用opener来获取文件对象的基础文件描述符。 opener必须返回一个打开的文件描述符(传递os.open作为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()函数返回的文件对象的类型取决于模式。 当open()用于以文本模式打开文件(w
,r
,wt
,rt
等)时,它返回io.TextIOBase的子类(特别是io.TextIOWrapper)。 当用于以二进制模式打开具有缓冲的文件时,返回的类是io.BufferedIOBase的子类。 确切的类别有所不同:在读取二进制模式下,它返回一个io.BufferedReader; 在写二进制和附加二进制模式时,它返回一个io.BufferedWriter,在读/写模式下,它返回一个io.BufferedRandom。 禁用缓冲时,将返回原始流,即io.RawIOBase的子类io.FileIO。