官方文档链接:https://docs.python.org/3/library/functions.html?highlight=open#open
以下是借助谷歌自动翻译和自己的理解译文
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
打开文件并返回相应的文件对象。如果无法打开该文件,OSError则会引发。有关如何使用此功能的更多示例,请参见 读取和写入文件。
file是一个类似路径的对象,提供了要打开的文件的路径名(绝对路径或相对于当前工作目录的路径)或要包装的文件的整数文件描述符。(如果给出了文件描述符,则除非将closefd 设置为False,否则当关闭返回的I / O对象时,它将关闭)
mode是一个可选字符串,用于指定打开文件的模式 。默认为'r',表示可以在文本模式下打开阅读。其他常用值'w'用于写入(如果文件已经存在,则将文件内容清空),'x'用于独占创建和'a'用于附加(在某些Unix系统上,这意味着所有写入都将附加到文件的末尾,而不管当前查找位置如何)。在文本模式下,如果编码未指定,则使用的编码是与平台相关的:调用locale.getpreferredencoding(False)获取当前的本地编码。(对于读写原始字节,请使用二进制模式并保留编码未指定。)
可用的模式有:
字符 含义
'r' 打开以供阅读(默认)
'w' 打开进行写入,先截断文件
'x' 打开以进行独占创建,如果文件已经存在则失败
'a' 打开进行写入,如果存在则追加到文件末尾
'b' 二进制模式
't' 文字模式(默认)
'+' 开放进行更新(读写)
默认模式为'r'(打开以阅读文本,与'rt'同义)。模式'w+'和'w+b' 打开并截断该文件。模式'r+' 并'r+b'打开文件而不会被截断。
如概述所述,Python区分二进制和文本I/O。文件以二进制模式(在模式参数包括'b')打开时,以字节对象返回内容而不会进行任何解码。在文本方式下(默认方式,或在mode参数中包括't'时),文件内容被作为字符串返回,首先使用与平台有关的编码或使用给定的指定编码对字节进行了解码 。
允许使用其他模式字符'U',该字符不再起作用,被认为已弃用。它以前在文本模式下启用了 通用换行符,这成为了Python3.0中的默认行为。有关更多详细信息,请参考newline参数的文档 。
注意:python不依赖于操作系统底层的文本文件概念;所有这些过程都是由python自己完成,因为python是独立于平台的。
buffering是用于设置缓冲策略的可选整数传递0以关闭缓冲(仅在二进制模式下允许),传递1以选择行缓冲(仅在文本模式下可用),传递
大于1的整数以指示固定大小的块缓冲区的字节大小。未指定缓冲策略时,默认缓冲策略如下:
二进制文件以固定大小的块缓冲,使用试探法来确定缓冲区大小,然后尝试确定底层设备的“块大小”,然后回退io.DEFAULT_BUFFER_SIZE。
在许多系统上,缓冲区的长度通常为4096或8192字节。
交互式文本文件(isatty() 返回的文件True)使用行缓冲,其他文本文件使用上述二进制文件的策略
encoding参数是用于编码和解码文件的编码方式的名称,且此参数只用于文本模式。默认的编码方式是依赖于平台的,(即locale.getpreferredencoding()的返回值),但是任何python支持的文本编码方式都是可以使用的。请参阅codecs模块以获取受支持的编码列表。
errors参数是一个可选的字符串参数,用于说明当编码和解码错误将会怎样被处理-在二进制模式下不可用,可以使用多种标准错误处理程序(在 Error Handlers之下列出)。尽管已经在codecs.register_error()中注册了的错误处理名称均是有效的,标准名称包含:
•‘strict’:当有编码错误时,抛出ValueError异常,默认值None与此有同样的效果。
•'ignore':忽略错误,注意忽略编码错误可能会丢失数据
•'replace':在有错误数据地方插入替代标记(比如?)
• 'surrogateescape'将在 Unicode 专用使用区域(从 U+DC80 到 U+DCFF)中将任何不正确的字节显示为代码点。当写入数据时使用错误处理程序后,这些专用代码点将重新转换为相同的字节。这对于以未知编码处理文件非常有用。
• 'xmlcharrefreplace'仅在写入文件时受支持。编码不支持的字符将替换为相应的 XML 字符引用。
• 'backslashreplace'用 Python 的反斜杠转义序列替换格式错误的数据。
• 'namereplace'(也仅在写入时支持)将不受支持的字符替换为转义序列。
newline参数控制通用的新行模式如何工作(且只能用于文本模式),它可以是None,'','
','
',和‘
’。它的工作方式如下:
•从流中读取输入时(即读取时),如果newline为None,则启用通用换行模式。输入中的行可以以'
','
'或‘
’结束, 在返回给调用方之前,均会被翻译成'
'。如果为'',则启用通用换行模式,但是行结尾不翻译就返回给呼叫者。如果它具有任何其他合法值,则输入行仅由给定的字符串终止,并且该行的末尾不翻译就返回给调用方。
•将输出写入流时,如果newline为None,则写入的所有'
' 字符都会转换为系统默认的行分隔符, os.linesep。如果换行符是''或'
',则不会进行翻译。如果换行符是其他任何合法值,则写入的任何‘
’字符将转换为给定的字符串。
closefd参数
如果closefd是False并且给出了文件描述符而不是文件名,则在关闭文件时,底层文件描述符将保持打开状态。如果给定文件名,closefd必须为True(默认),否则将引发错误。
opener
一个通用的opener通过传递一个可调用的对象作为opener来使用。文件对象的底层的文件描述符可通过调用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
函数返回的文件对象的类型取决于模式(mode)。当被用来以文本模式打开文件(‘w’,'r','wt','rt',等等),它返回的
io.TextIOBase一个子类 (具体是io.TextIOWrapper)。当用于带缓冲的二进制模式下打开文件时,返回的类是io.BufferedIOBase的子类。确切的类有所不同:在读取二进制模式下,它返回io.BufferedReader;在写二进制和追加二进制模式下,它返回io.BufferedWriter,,在读/写模式下,它返回一个io.BufferedRandom。当缓冲被禁用时,则返回原始流,它是io.RawIOBase, io.FileIO的一个子类。
参见文件处理模块,如,fileinput,io (其中声明了open()),os, os.path, tempfile, and shutil
使用open()的参数file ,mode ,flags抛出一个审核事件