Python3.7 的open()方法详解

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 first
  • x open for exclusive(独占) creation, failing if the file already exists
  • 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)

默认模式为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()用于以文本模式打开文件(wrwtrt等)时,它返回io.TextIOBase的子类(特别是io.TextIOWrapper)。 当用于以二进制模式打开具有缓冲的文件时,返回的类是io.BufferedIOBase的子类。 确切的类别有所不同:在读取二进制模式下,它返回一个io.BufferedReader; 在写二进制和附加二进制模式时,它返回一个io.BufferedWriter,在读/写模式下,它返回一个io.BufferedRandom。 禁用缓冲时,将返回原始流,即io.RawIOBase的子类io.FileIO。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值