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
其他
版本变更内容
拓展阅读
因为该函数的官方参考手册引文篇幅过大,不再本文中体现,本文的内容均翻译自官方手册,如有需要查询原引文内容的,详见官方手册。另外,本文中涉及的链接,会在发布相应的文章后陆续进行补充。
默认模式’r’(只读打开,等同于’rt’)。对于二进制读写访问,’w+b’模式打开,并将文件截断为0字节。’r+b’不截断打开文件。
Python区分二进制和文本I/O。文件以二进制模式打开(mode参数含’b’),不进行任何解码,将内容以bytes对象返回。在文本模式下(默认,或mode参数含’t’),返回的文件内容是str,将使用平台依赖的编码或指定编码首先对字节进行解码。
注意:Python不依赖底层操作系统的文本文件概念,所有的处理有Python自身完成,因此是具有平台独立性的。
bufferi
buffering是一个整数可选项,用于设置缓冲策略,传入0关闭缓冲(仅允许在二进制模式下),1选择行缓冲(尽用于文本模式),大于1的整数用于指示某个固定大小的块缓冲区的字节大小。当没有给定buffering参数时,默认缓冲策略运行如下:
二进制文件在固定大小的块内缓冲,缓冲区大小的选择,会使用启发式的方法来尝试决定底层设备的“块尺寸“,并退回至io.DEFAULT_BUFFER_SIZE。在很多系统上,缓冲区通常的字长是4096或8192。
”交互式“文本文件(对于isatty()返回True的文件)使用行缓冲,其他文本文件使用的策略与上面二进制文件的相同。
‘strict’,如果有编码错误,引发ValueError异常, 默认值None有同样效果。
‘ignore’ ,忽略错误。注意:忽略编码错误可能导致数据丢失。
‘replace’,会导致在出现畸形数据的地方插入替代符号(例如’?’)。
‘surrogateescape’ ,会将任何不正确的字节以Unicode Private Use Area(区间U+DC80到U+DCFF)中的代码点表示。当写入数据时,若使用surrogateescape错误处理程序,这些私有代码点随后会转化回相同的字节,这对于处理未知编码文件非常有用。
‘xmlcharrefreplace’ 只支持写入文件,编码不支持的字符会用适当的XML字符引用nnn;进行替换。
‘backslashreplace’ 可以用Python的反斜杠转义序列替换畸形数据。
‘namereplace’ (仅支持写入),用\N{…}转义序列替换不支持的字符。
当从流读取输入时,如果newline值为None,通用换行模式启用,输入中的行尾可以是’\n’、’\r’或’\r\n’,这些会在返回给调用者前转换为’\n’;如果参数值是”,通用换行模式启用,但是行尾不做转换返回给调用者;如果它有任意其他合法值,输入行以给定字符串结束,行尾不做转换返回给调用者。
当把输出写入到流时,如果newline值为None,任意写入的’\n’将转换为系统默认的行分隔符(详见os.linesep);如果newline值为”或’\n’,不进行转换;如果newline值为其他任意合法值,所有写入的’\n’字符将转换为给定字符串。
新创建的文件是非继承的。
相较一个给定的目录,以下的实例使用了os.open()函数的dir_fd参数来打开一个文件:
当open()以文本模式(’w’, ‘r’, ‘wt’, ‘rt’, etc.)打开一个文件时,它返回io.TextIOBase(特殊形式为io.TextIOWrapper)的一个子类;
当用缓冲以二进制模式打开一个文件时,返回的类是io.BufferedIOBase的一个子类,确切的类差异情况包括:
在只读二进制模式下,它返回io.BufferedReader;
在可写和添加二进制模式下,它返回io.BufferedWriter;
当禁用缓冲时,返回原始流、io.RawIOBase的子类和io.FileIO
可以参考其他的文件处理模块,例如:fileinput、io (声明open()的类)、os、os.path、tempfile和shutil。
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
参数使用说明
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’ | 通用换行模式(已过时) |
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
可以参考其他的文件处理模块,例如:fileinput、io (声明open()的类)、os、os.path、tempfile和shutil。
版本变更内容
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标准库:内置函数open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=T
- Python标准库:内置函数open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=T
- python学习——python中的文件处理之open()、file()函数
- 关于python无法显示中文的问题:SyntaxError: Non-ASCII character '\xe4' in file test.py on line 3, but no encoding
- 【python问题系列--1】SyntaxError:Non-ASCII character '\xe5' in file kNN.py on line 2, but no encoding declared;
- python问题Non-ASCII character '\xe5' in file Apriori.py on line 1, but no encoding declared 解决办法
- 关于python无法显示中文的问题:SyntaxError: Non-ASCII character '\xe4' in file test.py on line 3, but no encoding
- 一张图看懂python中open函数的mode参数怎么用
- 关于python无法显示中文的问题:SyntaxError: Non-ASCII character '\xe4' in file test.py on line 3, but no encoding
- python - 中文打印报错SyntaxError: Non-ASCII character '\xe4' in file test.py on line 3, but no encoding declared。
- 关于使用python的open函数出现No Such file or dir的错误
- Python: SyntaxError: Non-ASCII character '\xa3' in file main.py on line 3, but no encoding declared
- SyntaxError: Non-ASCII character '\xe5' in file index.py on line 6, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
- SyntaxError: Non-ASCII character '\xe5' in file a.py on line 9, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
- [已解决]关于python无法显示中文的问题:SyntaxError: Non-ASCII character '\xe4' in file test.py on line 3, but no encoding declared。
- python问题Non-ASCII character '\xe5' in file Apriori.py on line 1, but no encoding declared 解决办法
- python问题Non-ASCII character '\xe5' in file Apriori.py on line 1, but no encoding declared 解决办法
- Python 内建函数 - bytes([source[,encoding[,errors]]])
- SyntaxError: Non-UTF-8 code starting with '\xc5' in file t.py on line 3,but no encoding declared;see http://python.org/dev/peps/pep-0263/ for details
- How can I force Python's file.write() to use the same newline format in Windows as in Linux (“\r\n”