当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python open用法及代码示例


用法:

open(file, mode='r', buffering=- 1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

打开file 并返回相应的文件对象。如果无法打开文件,则会引发 OSError。有关如何使用此函数的更多示例,请参阅读取和写入文件。

file 是一个 path-like 对象,它给出要打开的文件的路径名(绝对或相对于当前工作目录)或要包装的文件的整数文件说明符。 (如果给定文件说明符,则在关闭返回的 I/O 对象时将其关闭,除非 closefd 设置为 False 。)

mode 是一个可选字符串,用于指定打开文件的模式。它默认为'r',这意味着以文本模式打开以供阅读。其他常见的值是用于写入的'w'(如果文件已经存在则截断文件)、用于独占创建的'x'和用于追加的'a'(在some Unix 系统上,意味着all 写入追加到无论当前的查找位置如何,文件的结尾)。在文本模式下,如果未指定encoding,则使用的编码取决于平台:调用locale.getpreferredencoding(False) 以获取当前的语言环境编码。 (对于读取和写入原始字节,请使用二进制模式并保持 encoding 未指定。)可用的模式是:

特点

意义

'r'

打开阅读(默认)

'w'

打开写入,首先截断文件

'x'

打开以独占创建,如果文件已存在则失败

'a'

打开写入,如果存在则附加到文件末尾

'b'

二进制模式

't'

文本模式(默认)

'+'

开放更新(读写)

默认模式是'r'(打开阅读文本,'rt' 的同义词)。 'w+''w+b' 模式打开并截断文件。 'r+''r+b' 模式打开文件时不进行截断。

如概述中所述,Python 区分二进制和文本 I/O。以二进制模式打开的文件(包括mode 参数中的'b')将内容作为bytes 对象返回,无需任何解码。在文本模式下(默认情况下,或者当 't' 包含在 mode 参数中时),文件的内容以 str 的形式返回,这些字节首先使用平台相关的编码或使用指定的解码encoding 如果给定。

允许使用额外的模式字符 'U' ,它不再有任何效果,并且被视为已弃用。它之前在文本模式下启用了通用换行符,这成为 Python 3.0 中的默认行为。有关更多详细信息,请参阅换行参数的文档。

注意

Python 不依赖于底层操作系统的文本文件概念;所有的处理都是由 Python 自己完成的,因此与平台无关。

buffering 是用于设置缓冲策略的可选整数。传递 0 以关闭缓冲(仅在二进制模式下允许),1 以选择行缓冲(仅在文本模式下可用),以及整数 > 1 以指示固定大小的块缓冲区的大小(以字节为单位)。当没有给出 buffering 参数时,默认缓冲策略的工作方式如下:

  • 二进制文件以固定大小的块缓冲;缓冲区的大小是通过尝试确定底层设备的 “block size” 并退回到 io.DEFAULT_BUFFER_SIZE 的启发式方法来选择的。在许多系统上,缓冲区通常为 4096 或 8192 字节长。
  • “Interactive” 文本文件(isatty() 返回 True 的文件)使用行缓冲。其他文本文件使用上述二进制文件的策略。

encoding 是用于对文件进行解码或编码的编码名称。这应该只在文本模式下使用。默认编码取决于平台(无论locale.getpreferredencoding() 返回什么),但可以使用 Python 支持的任何文本编码。有关支持的编码列表,请参阅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'.它的工作原理如下:

  • 从流中读取输入时,如果 newlineNone ,则启用通用换行模式。输入中的行可以以 '\n''\r''\r\n' 结尾,这些行在返回给调用者之前会被翻译成 '\n'。如果是 '' ,则启用通用换行符模式,但行尾会返回给调用者,但未翻译。如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且行结束符未翻译地返回给调用者。
  • 将输出写入流时,如果 newlineNone ,则写入的任何 '\n' 字符都将转换为系统默认行分隔符 os.linesep 。如果 newline'''\n' ,则不进行翻译。如果 newline 是任何其他合法值,则写入的任何 '\n' 字符都将转换为给定字符串。

如果 closefdFalse 并且给出了文件说明符而不是文件名,则当文件关闭时,底层文件说明符将保持打开状态。如果给定文件名 closefd 必须是 True (默认);否则,将引发错误。

可以通过将可调用对象传递为 opener 来使用自定义开启器。然后通过使用(fileflags)调用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

另请参阅文件处理模块,例如 fileinputio (其中声明了 open() )、 osos.pathtempfileshutil

使用参数 filemodeflags 引发审计事件 open

modeflags 参数可能已被修改或从原始调用中推断出来。

在 3.3 版中更改:
  • 添加了opener 参数。

  • 添加了'x' 模式。

  • IOError 曾经被提出,现在是 OSError 的别名。

  • 如果以独占创建模式('x')打开的文件已经存在,则会引发 FileExistsError

在 3.4 版中更改:
  • 该文件现在不可继承。

自 3.4 版起已弃用,在 3.10 版中删除: 'U'模式。

在 3.5 版中更改:
  • 如果系统调用被中断并且信号处理程序没有引发异常,则该函数现在重试系统调用而不是引发InterruptedError例外(见PEP 475理由)。

  • 添加了'namereplace' 错误处理程序。

在 3.6 版中更改:
  • 添加了支持以接受实现 os.PathLike 的对象。

  • 在 Windows 上,打开控制台缓冲区可能会返回 io.RawIOBase 的子类,而不是 io.FileIO

相关用法


注:本文由纯净天空筛选整理自python.org大神的英文原创作品 open。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。