open模块
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
-
打开给定路径的
file
文件, 并返回对应的一个file object
; -
如果要打开的文件,不能被打开,就会触发
OSError
异常; -
file
是一个路径对象(str),表示将要打开的文件路径(绝对路径或当前工作目录的相对路径),也可以是被封装的整数类型文件描述符;- 如果是文件描述符,它会随着返回的
I/O
对象关闭而关闭,除非closefd
被设为False;
- 如果是文件描述符,它会随着返回的
-
mode
是一个可选字符串,用于指定打开文件的模式。默认是r
,也就是默认以文本模式打开并读取。-
字符 含义 ‘r’ 读取(默认) ‘w’ 写入,并先截断文件原本内容 ‘x’ 排它性创建,如果文件已存在则失败 ‘b’ 二进制模式 ‘a’ 写入,如果文件存在则在末尾追加 ‘t’ 文本模式(默认) ‘+’ 打开用于更新(读取与写入) -
默认模式为
'r'
(打开用于读取文本,与rt
同义)。 -
模式
'w+'
与'w+b'
将打开文件并清空内容。 -
模式
'r+'
与'r+b'
将打开文件并不清空内容。
-
-
在文本模式,如果
encoding
没有指定,则根据系统平台来决定使用的编码。可以使用locale.getpreferredenconding(False)
来获取自己平台的编码。>>> import locale >>> locale.getpreferredencoding(False) 'cp936' # 我的系统编码
-
buffering
是一个可选的整数,用于设置缓冲策略。-
传递0以切换缓冲关闭(仅支持二进制模式下)
>>> import os >>> os.getcwd() # 查看当前工作目录 'C:\\Users\\www13\\AppData\\Local\\Programs\\Python\\Python38-32' >>> ab = open('d:/data.txt', 'ab', buffering=0) # 创建一个没有缓冲区的 file object >>> ab.write('hello 你好啊') # 写入正常字符串,报错 --------------------------Error------------------------------- Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> ab.write('hello 你好啊') TypeError: a bytes-like object is required, not 'str' ---------------------------错误-------------------------------- >>> ab.write(bytes('hello 你好啊'.encode())) # 写入二进制字符串,响应正常为写入字节长度并且不需要close或flush就可以在文本中看到。 15
-
传递1选择行缓冲(仅支持文本模式下可用),并且
>1
的整数以指定固定大小的块缓冲区的大小(以字节为单位)。>>> ab = open('d:/data.txt', 'at', buffering=1) # 创建行缓冲 file object >>> ab.write('你好,Vin\n') # \n换行符结尾,自动刷新缓冲区 7 >>> ab.write('你好,Vin') # 不会刷新缓冲区 6 >>> ab.write('你好,蟒蛇\n') # 自动刷新缓冲区 6 >>> ab.write('你好,蟒蛇2') 6 >>> ab.write('你好,蟒蛇3') 6 >>> ab.write('你好蟒蛇4\n') 6 >>> # 也就是说,buffering参数设置为1的情况下,想让它刷新缓冲区,它只认得 \n 这个东西。 >>> ab = open('d:/data.txt', 'ab', buffering=5) # 创建自定义字节大小缓冲 file object >>> ab.write(bytes('hello'.encode())) # 刚好五个字节,不会刷新缓冲区。 5 >>> ab.flush() # 先把之前的缓冲区刷新一下 >>> ab.write(bytes('buffering=5'.encode())) # 大于五个字节,自动刷新缓冲区。 11
-
如果没有给
buffering
参数,则默认缓冲策略的工作方式如下:- 二进制文件以固定大小的块进行缓冲;使用启发式方法选择缓冲区的大小,尝试确定底层设备的“块大小”或使用
io.DEFAULT_BUFFER_SIZE
。在许多系统上,缓冲区的长度通常为4096或8192字节。 - “交互式”文本文件(
isatty()
返回True
的文件)使用行缓冲。其它文本文件使用上述策略用于二进制文件。
>>> ab = open('d:/data.txt', 'ab') # 创建一个有缓冲区的 file object >>> ab.write(bytes('hi LiLa Vin'.encode())) # 写入响应正常,但是文本却看不到,因为还在缓冲区中,没有到达默认的缓冲区长度。 11 >>> ab.close() # 或 ab.flush
- 二进制文件以固定大小的块进行缓冲;使用启发式方法选择缓冲区的大小,尝试确定底层设备的“块大小”或使用
-
-
encoding
是用于解码或编码文件的编码名称。- 这
应该
只在文本模式下使用(也就是官方不建议使用二进制模式下,给encoding
传值) - 默认编码是依赖于平台的(不管
locale.getpreferredencoding()
返回任何值),但可以使用任何Python支持的文本编码方式
。
- 这
-
errors
是一个可选的字符串参数- 用于指定如何处理编码和解码错误(这不能在二进制模式下使用)。
- 可以使用各种标准错误处理程序,但是使用
codecs.register_error()
注册的任何错误处理名称也是有效的。标准名称