您的位置:首页 > 编程语言 > Python开发

Python 内建函数 - open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None...)

2017-03-21 14:45 447 查看
参数形式

参数使用说明
file

mode

buffering

encoding

errors

newline

closefd

opener

其他

版本变更内容

拓展阅读

因为该函数的官方参考手册引文篇幅过大,不再本文中体现,本文的内容均翻译自官方手册,如有需要查询原引文内容的,详见官方手册。另外,本文中涉及的链接,会在发布相应的文章后陆续进行补充。

参数形式

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

参数使用说明

打开发文件并返回相应的文件对象,如果文件不能打开,则引发OSError异常。

file

file可以是字符串或字节对象,用于给出要打开文件路径名(绝对或相对当前工作目录)或要打包文件的整数文件描述符。如果给定某个文件描述符,当返回的I/O对象关闭时那么它会被关闭,除非closefd设为False。

mode

mode是一个可选的字符串参数,用来指定文件打开模式。默认值为’r’,表示以文本模式只读打开。其他常用值有:’w’可写(若文件已经存在则截断),’x’单独创建,’a’添加(在一些Unix系统上,这意味着不管当前查找位置,所有写入添加到文件尾部)。在文本模式下,如果没有指定编码,那么编码的使用依赖于平台:调用locale.getpreferredencoding(False)来获取当前本地编码(对于读写原始字节,使用二进制模式,且不用指定编码)。可用的mode有:

字符含义
‘r’只读打开(默认)
‘w’写入打开,首先截断文件
‘x’单独创建打开,如果文件已存在则失败
‘a’写入打开,如果文件存在则添加到尾部
‘b’二进制模式
‘t’文本模式(默认)
‘+’更新方式(读、写)打开磁盘文件
‘U’通用换行模式(已过时)
默认模式’r’(只读打开,等同于’rt’)。对于二进制读写访问,’w+b’模式打开,并将文件截断为0字节。’r+b’不截断打开文件。

Python区分二进制和文本I/O。文件以二进制模式打开(mode参数含’b’),不进行任何解码,将内容以bytes对象返回。在文本模式下(默认,或mode参数含’t’),返回的文件内容是str,将使用平台依赖的编码或指定编码首先对字节进行解码。

注意:Python不依赖底层操作系统的文本文件概念,所有的处理有Python自身完成,因此是具有平台独立性的。

bufferi
4000
ng

buffering是一个整数可选项,用于设置缓冲策略,传入0关闭缓冲(仅允许在二进制模式下),1选择行缓冲(尽用于文本模式),大于1的整数用于指示某个固定大小的块缓冲区的字节大小。当没有给定buffering参数时,默认缓冲策略运行如下:

二进制文件在固定大小的块内缓冲,缓冲区大小的选择,会使用启发式的方法来尝试决定底层设备的“块尺寸“,并退回至io.DEFAULT_BUFFER_SIZE。在很多系统上,缓冲区通常的字长是4096或8192。

”交互式“文本文件(对于isatty()返回True的文件)使用行缓冲,其他文本文件使用的策略与上面二进制文件的相同。

encoding

encoding是用于编码或解码文件的编码名称。该参数应仅用于文本模式,默认的编码是平台依赖的(无论locale.getpreferredencoding()返回什么),但所有Python支持的文本编码都可使用,支持的编码列表参考codecs模块。

errors

errors是一个字符串可选项,用于指定如何操作编、解码的错误(不能用于二进制模式)。目前能找到各种的标准错误处理程序(在错误处理程序中列出),然而用codecs.register_error()注册的所有错误处理名也有效,这些标准名称包括:

‘strict’,如果有编码错误,引发ValueError异常, 默认值None有同样效果。

‘ignore’ ,忽略错误。注意:忽略编码错误可能导致数据丢失。

‘replace’,会导致在出现畸形数据的地方插入替代符号(例如’?’)。

‘surrogateescape’ ,会将任何不正确的字节以Unicode Private Use Area(区间U+DC80到U+DCFF)中的代码点表示。当写入数据时,若使用surrogateescape错误处理程序,这些私有代码点随后会转化回相同的字节,这对于处理未知编码文件非常有用。

‘xmlcharrefreplace’ 只支持写入文件,编码不支持的字符会用适当的XML字符引用&#nnn;进行替换。

‘backslashreplace’ 可以用Python的反斜杠转义序列替换畸形数据。

‘namereplace’ (仅支持写入),用\N{…}转义序列替换不支持的字符。

newline

newline控制通用换行模式如何运行(只支持文本模式),该值可以是None, ”, ‘\n’、’\r’和’\r\n’,以如下方式运行:

当从流读取输入时,如果newline值为None,通用换行模式启用,输入中的行尾可以是’\n’、’\r’或’\r\n’,这些会在返回给调用者前转换为’\n’;如果参数值是”,通用换行模式启用,但是行尾不做转换返回给调用者;如果它有任意其他合法值,输入行以给定字符串结束,行尾不做转换返回给调用者。

当把输出写入到流时,如果newline值为None,任意写入的’\n’将转换为系统默认的行分隔符(详见os.linesep);如果newline值为”或’\n’,不进行转换;如果newline值为其他任意合法值,所有写入的’\n’字符将转换为给定字符串。

closefd

如果closefd为False,且给定文件描述符(而不是文件名),那么当文件关闭时底层文件描述符将保持打开。如果给定文件名,closefd必须为True(默认)。否则将引发错误。

opener

opener可以传递调用一个自定义打开器,然后通过调用opener获取文件对象的底层文件描述符。opener必须返回一个打开文件描述符(传递os.open与传递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)  # 不要泄露文件描述符


其他

open()函数返回的文件对象类型依赖于mode

open()以文本模式(’w’, ‘r’, ‘wt’, ‘rt’, etc.)打开一个文件时,它返回io.TextIOBase(特殊形式为io.TextIOWrapper)的一个子类;

当用缓冲以二进制模式打开一个文件时,返回的类是io.BufferedIOBase的一个子类,确切的类差异情况包括:

在只读二进制模式下,它返回io.BufferedReader

在可写和添加二进制模式下,它返回io.BufferedWriter

当禁用缓冲时,返回原始流、io.RawIOBase的子类和io.FileIO

可以参考其他的文件处理模块,例如:fileinputio (声明open()的类)、osos.pathtempfileshutil

版本变更内容

version 3.3变更: 增加opener参数 ;增加’x’模式;以往IOError异常现更名为OSError;现在如果以单独创建模式(’x’)打开的文件已经存在的话,将引发FileExistsError。

version 3.4变更: 文件现在是非继承的了。

从version 3.4开始不建议的,且将会在version 4.0移除的内容: ‘U’模式。

version 3.5变更: 如果系统调用中断,且信号处理程序没有引发异常,那么现在该函数将重试系统调用(替代引发InterruptedError异常)。

version 3.5变更: 增加’namereplace’错误处理程序。

拓展阅读

文件对象

bytes

str

io.DEFAULT_BUFFER_SIZE

isatty()

locale.getpreferredencoding()

codecs

错误处理程序

codecs.register_error()

os.linesep

os.open

io.TextIOBase

io.TextIOWrapper

io.BufferedIOBase

io.BufferedReader

io.BufferedWriter

io.BufferedRandom

io.RawIOBase

io.FileIO

fileinput

io

os

os.path

tempfile

shutil
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python
相关文章推荐