Python open函数详解

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

演示环境操作系统Win10 21H264bitPython解释器3.8.10。

open是Python的一个内置函数一般用于本地文件的读写操作。用法如下。

my_file = open(file, mode, buffering, encoding, errors, newline, closefd, opener)  # 打开文件
...  # 读写操作。省略
my_file.colse()  # 释放文件

open函数必须搭配.close()方法使用先用open打开文件然后进行读写操作最后用.close()释放文件。open函数有八个参数如下。

file文件路径或文件描述符。如为文件路径则是str类型如是文件描述符则是一个非负整数。文件描述符使用较少通常情况下都传入文件路径。file参数和closefd参数有关closefd为True则file既可以传入文件路径又可以传入文件描述符。closefd为False则file只能传入文件描述符。这里的文件描述符应拓展理解为Unix、Linux系统的文件描述符和Windows系统的句柄。可以简单理解为在Unix、Linux系统下叫文件描述符在Windows系统下叫句柄。打开或新建文件时操作系统内核会返回一个非负整数可以用来访问指定文件这个非负整数就是文件描述符。在Python中可以使用os模块的open函数获取其文件描述符。下面是一个例子。
图1
图1

import os


a = os.open("data.txt", os.O_RDONLY)  # 打开文件并获取其文件描述符
file = open(a, "r")  # 打开文件
print(file.read())  # 打印文件内容
file.close()  # 关闭文件


# 注释1代码运行结果如图2。
# 注释2data.txt文件内容如图1。

图2
由上例可见file参数传入文件描述符是可以的但注意这只是为了举例说明实际这样做没有什么应用价值。通常情况下我们还是传入文件路径。

mode操作模式可选str类型默认为r。可选值包括r、r+、w、w+、a、a+、x、x+、rb、wb、ab、xb、rt、at、wt、xt这16种。乍一看比较乱其实很好理解。基本操作模式有四种r、w、a、x分别代表读、写、追加、创建新文件。

r模式下只能对文件进行读取操作不能写入。指定文件若不存在会报错。w模式下只能对文件进行写入操作不能读取。指定文件存在则直接打开写入。若不存在则先创建文件再写入。a模式下同样只能对文件进行写入操作不能读取。指定文件存在则直接打开写入。若不存在则先创建文件再写入。

a模式和w模式的区别在于w模式写入时会先将文件原内容清空再写入新内容。a模式不会清空文件原内容而是把新内容追加在原内容之后。

x模式是新建一个文件然后只能对其进行写入操作不能读取。x模式下指定文件必须不存在若已存在则会报错。

r、w、a、x是基本的操作模式mode参数不管指定为什么必定是基于这四种操作模式之一。这句话怎么理解呢刚才说了mode参数可选只能是上面那16种之一可以看下那16种值是不是都包含了r、w、a、x之一。例如rt、r+实际都是基于r模式的变种与单纯的r模式相比有一些功能上的改变。w、a、x也是同理。

可以看到如果是变种第二个字符也不是随便取的只能是t或b或+。先说t和b。t和b控制Python读写内容的方式是相对应的。t代表以文本方式读写读写时以字符为单位只能用于读写文本类型的文件比如.txt、.log、.csv等能直接用文本编辑器打开的文件类型。b代表以二进制方式读写读写时以字节为单位可以用于读写所有类型的文件。这里注意一下若使用t方式则必须将encoding参数指定为除None以外的值。若使用b方式则必须将encoding参数指定为None。t和b只用于控制读写方式必须依附于r、w、a、x四种基本模式使用。即不能将mode参数指定为t或b但可以是rt、wt、at、xt、rb、wb、ab、xb。因为open函数读写默认采用t方式所以如果省略不写则默认为t。即rt、wt、at、xt等价于r、w、a、x。

所以mode参数省略不写、指定为r、指定为rt实际是一回事没有区别。

至于+有点升级版的意思好理解但各自的含义记起来比较绕下面用一个表格说明。

mode参数可做操作若文件不存在如何处理原内容
r只可读报错-
r+可读可写报错
w只可写创建
w+可读可写创建
a只可写创建否追加
a+可读可写创建否追加
x只可写创建-
x+可读可写创建-

buffering缓冲设置值可以是任意一个正整数、负整数或0默认为-1。为负整数时缓冲区的大小设置使用系统默认缓冲机制具体会遵从以下两点策略。一当mode参数为二进制模式时采用固定块内存缓冲区方式内存块的大小根据系统设备分配的磁盘块来决定如果获取系统磁盘块的大小失败就使用内部常量io.DEFAULT_BUFFER_SIZE定义的大小。一般的操作系统上块的大小是4096或者8192字节。二对于交互的文本文件isatty()判断为True采用行缓冲区的方式。其它文本文件使用跟二进制一样的方式。注意buffering设置为任意负整数效果都是相同的。buffering若为0则不使用缓冲区即缓冲区大小为0写入和读取都是直接与磁盘对接。buffering若为1则表示缓冲区采用行缓冲区即只能放一行数据遇到换行符即清空缓存将数据写入磁盘。buffering为大于1的正整数时这个正整数即代表缓冲区的大小单位为字节。例如buffering=100表示缓冲区大小为100Byte。达到100Byte即将数据写入磁盘。

encoding打开文件所用的编码可选str类型默认为None。encoding参数仅可在采用文本方式即mode值带t读写数据的情况下有效二进制方式下不可指定。文本编码有很多常用的有utf-8、ascii、gbk等。mode参数采用文本方式的情况下若encoding指定为None则编码为locale.getpreferredencoding(False)这行代码的返回值。在Windows下这行代码一般返回值为cp936,。cp936指的就是gbk。

errors编解码报错的处理模式可选str类型默认为None。用于设置当open函数发生编码或解码错误时的处理方式。注意仅当mode参数采用文本方式时有效二进制方式下不可指定。常用的可选值有strict、ignore、replace、surrogateescape、xmlcharrefreplace、backslashreplace、namereplace等。下面分别解释下每个值的含义。

strict编解码错误则报错ValueError。

ignore编解码出现错误会忽略不报错。

replace编解码出现错误不会报错会用?替代要写入或读取的无法解析的数据。Python官网的说明中对替代字符的描述是such as?。所以说对无法编解码数据目前只知道会用替代至于是否会用其他符号代替我不清楚。

newline换行符设置可选str类型默认为None。可选值包括None、"\r"、"\n"、"\r\n"。不同计算机操作系统所规定的换行符表示方法是不一样的Windows采用"\r\n"MacOS采用"\r"Unix和Linux采用"\n"。newline参数就是为了规定读取文本内容时什么才算换行符。

closefd控制file参数的传入值类型。bool类型默认为True。当为True时file参数可以是表示文件路径的字符串也可以是文件描述符。当为False时file参数只能是文件描述符传入字符串会报错。

opener具体含义暂不清楚。

好了以上就是本文的所有内容了谢谢大家观看。

谢谢支持谢谢。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: python