Python open函数详解

article/2025/10/23 15:00:59

演示环境,操作系统:Win10 21H2(64bit);Python解释器: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 osa = os.open("data.txt", os.O_RDONLY)  # 打开文件,并获取其文件描述符
file = open(a, "r")  # 打开文件
print(file.read())  # 打印文件内容
file.close()  # 关闭文件# 注释1:代码运行结果如图2。
# 注释2:data.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:具体含义暂不清楚。

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

谢谢支持,谢谢。


http://chatgpt.dhexx.cn/article/BjupCNp6.shtml

相关文章

sql去重查询

背景: 项目有消息推送,根据消息推送记录,筛选出一共有哪几种消息类型,并且标题和文本是什么 表部分结构如图: 主要是根据subject来去重所有数据,难点是,使用distinct的话,无法显示…

sql 去重查询 distinct

sql 去重查询 select Distinct UserId,Name from UserInfo where UserType1 介绍 distinct一般是用来去除查询结果中的重复记录的,而且这个语句在select、insert、delete和update中只可以在select中使用, 具体的语法如下: select distinc…

SQL去重的三种方法

目录 1.distinct去重 2.group by去重 3.row_number() over (parttion by 分组列 order by 排序列) 有这么一张test的表, 我们将对这张表进行操作来自验证去重 这里的去重:查询的时候, 不显示重复,并不是删除表中的重复项 1.distinct去重 只能一列去…

SQL去重方法汇总

更多教程请到友情连接: 菜鸟教程https://www.piaodoo.com 茂名一技http://www.enechn.com ppt制作教程步骤 http://www.tpyjn.cn 兴化论坛http://www.yimoge.cn 电白论坛 http://www.fcdzs.com 在使用SQL提数的时候,常会遇到表内有重复值的时候&…

SQL中去除重复数据的几种方法,我一次性都告诉你​

使用SQL对数据进行提取和分析时,我们经常会遇到数据重复的场景,需要我们对数据进行去重后分析。 以某电商公司的销售报表为例,常见的去重方法我们用到distinct 或者group by 语句, 今天介绍一种新的方法,利用窗口函数对…

SQL:数据去重的三种方法

1、使用distinct去重 distinct用来查询不重复记录的条数,用count(distinct id)来返回不重复字段的条数。用法注意: distinct【查询字段】,必须放在要查询字段的开头,即放在第一个参数;只能在SELECT 语句中使用&#…

SQL去重的三种方法汇总​

SQL去重的三种方法汇总​ 这里的去重是指:查询的时候, 不显示重复,并不是删除表中的重复项 1.distinct去重 注意的点:distinct 只能一列去重,当distinct后跟大于1个参数时,他们之间的关系是&&(逻辑与)关系&a…

SQL去重

SQL去重是数据分析工作中比较常见的一个场景,今天给大家具体介绍3种去重的方法。在使用SQL提数的时候,常会遇到表内有重复值的时候,比如我们想得到 uv (独立访客),就需要做去重。 在 MySQL 中通常是使用 di…

SQL查询去掉重复数据

本文主要总结数据库去掉重复数据的方法 去掉重复数据的方法: 第一种:distinct 根据单个字段去重,能精确去重;作用在多个字段时,只有当这几个字段的完全相同时,才能去重;关键字distinct只能放…

大数据系统基础 | 绪论

1 什么是大数据 1、Big data is an all-encompassing term for any collection of data sets so large and complex that it becomes difficult to process using traditional data processing apllications. -http://en.wikipedia.org/wiki/Big_data 2、如果一个数据集的规…

大数据测试

目录 1、前言 2、大数据测试策略 3、如何测试大数据应用程序 4、架构测试 5、性能测试 6、性能测试方法 7、性能测试参数 8、测试环境需求 9、大数据测试对比传统数据库测试 10、大数据场景中使用的工具 11、大数据测试的挑战 12、性能测试挑战 1、前言 大数据…

大数据系统测评服务

1. 专业服务 围绕大数据的基础平台、分析软件产品、大数据应用系统、大数据交易系统等,面向政府主管机构、大数据解决方案提供商和大数据建设需求方等提供支撑、测试和咨询服务。测试报告可作为大数据产品或系统市场推广或验收提供客观依据。 大数据基础平台测试…

大数据系统发展的技术路线

自从大数据出来后,数据管理界发生了巨大的变化,技术驱动成为大数据管理系统的一个主要变革力量。 传统的数据库管理系统以结构化数据为主,因此关系数据库系统(RDBMS)可以一统天下满足各类应用需求。然而,大…

大数据平台开发:大数据系统架构模块解析

企业要开展大数据相关业务,首先就需要基于自身的需求,来设计搭建数据系统平台。而大数据系统平台的搭建,需要基于实际需求,来进行系统架构规划。今天我们就从大数据平台开发的角度,来对大数据系统架构模块做一个简单的…

大数据画像系统-1.0

大数据画像系统-1.0 写在最前面操作流程与资源资源获取创建 Flask 工程添加必要第三方库将刚刚下载的文件放入 Flask 工程运行 效果首页城市数据页个人画像页 结语 写在最前面 你能找到这篇文章,那么画像系统是什么,你应该已经知道,大数据是…

【云计算与大数据技术】大数据系统总体架构概述(Hadoop+MapReduce )

一、总体架构设计原则 企业级大数据应用框架需要满足业务的需求,一是要求能够满足基于数据容量大,数据类型多,数据流通快的大数据基本处理需求,能够支持大数据的采集,存储,处理和分析,二是要能…

大数据系统计算技术展望

大数据是新一代信息技术的核心方面和竞争前沿,也是制约大数据产业快速发展的关键瓶颈。大数据技术创新能力已经成为后信息时代衡量国家竞争力的重要指标。与传统信息产业的发展过程相似,大数据必将逐渐形成一个相对独立、体系完善的产业形态,…

什么是大数据系统架构

大数据的应用开发过于偏向底层,具有学习难度大,涉及技术面广的问题,这制约了大数据的普及。现在需要一种技术,把大数据开发中一些通用的,重复使用的基础代码、算法封装为类库,降低大数据的学习门槛&#xf…

大数据系统的基础,大数据存储和计算技术

在存储方面,2000 年左右谷歌等提出的文件系统(GFS)、以及随后的 Hadoop 的分布式文件系统 HDFS(Hadoop Distributed File System)奠定了大数据存储技术的基础。 与传统系统相比,GFS/HDFS 将计算和存储节点在物理上结合在一起,从而避免在数据…

大数据系统架构的基本介绍

从数据处理的一般流程可以看到,在大数据环境下需要的关键技术主要针对海量数据的存储和海量数据的运算。传统的关系数据库经过近40年的发展已经成为了一门成熟同时仍在不断演进的数据管理和分析技术,结构化查询语言(SQL)作为存取关…