Python open函数详解

演示环境,操作系统:Win10 21H2(64bit);Python解释器:3.8.10。

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

1 my_file = open(file, mode, buffering, encoding, errors, newline, closefd, opener)  # 打开文件
2 ...  # 读写操作。省略
3 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函数获取其文件描述符。下面是一个例子。

Python open函数详解
图1
1 import os
 2
 3
 4 a = os.open("data.txt", os.O_RDONLY)  # 打开文件,并获取其文件描述符
 5 file = open(a, "r")  # 打开文件
 6 print(file.read())  # 打印文件内容
 7 file.close()  # 关闭文件
 8
 9
10 # 注释1:代码运行结果如图2。
11 # 注释2:data.txt文件内容如图1。

Python open函数详解
由上例可见,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:具体含义暂不清楚。

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

谢谢支持,谢谢。

Original: https://www.cnblogs.com/yifengyu/p/16382451.html
Author: 平行时空的旅者
Title: Python open函数详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/601398/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 互联网大厂那些儿“高逼格”词汇

    转载请注明出处❤️ 你好,我是测试蔡坨坨。 目前任职于上海某互联网公司测试开发工程师。 相信在互联网公司上班的同学,日常工作中一定听过不少互联网那些”高(zhuang)…

    数据库 2023年6月11日
    0166
  • Redis的Java客户端

    Redis 的 Java 客户端 Jedis 优点:以 Redis 命令作为方法名称,学习成本低廉,简单且实用 缺点:Jedis 的实例是线程不安全的,在多线程的环境下需要基于线程…

    数据库 2023年6月16日
    090
  • [LeetCode]28. 实现 strStr()

    实现 strStr() 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始…

    数据库 2023年6月9日
    090
  • Javaweb09-请求跳转项目 分页条件查询 + 增删改 + 邮件登录

    1、Jar 包 UTF-8 1.7 1.7 1.18.12 4.11 5.1.47 1.2.62 javax.servlet javax.servlet-api 3.1.0 pro…

    数据库 2023年6月16日
    093
  • 分布式事务解决方案

    分布式事务解决方案 花开堪折直须折,莫待无花空折枝。 分布式事务是指事务的操作位于不同的节点上,需要保证事务的ACID特性。在分布式架构下,每个节点只知晓自身操作的成功与失败,无法…

    数据库 2023年6月14日
    095
  • Minio的安装与使用

    Minio的安装与使用 一、Minio介绍 MinIO 是在 Apache License v2.0 下发布的高性能对象存储. 就是说是个存东西的玩意,比较方便配好启动就能访问,也…

    数据库 2023年6月6日
    0107
  • FastDFS安装和简介详细总结

    1、fastDFS简介 1 FastDFS是用c语言编写的一款开源的分布式文件系统。 2 FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用…

    数据库 2023年6月14日
    0112
  • gauss正则找汉字

    select substring( ‘沙特阿拉伯6.20’ from ‘[\u4E00-\u9FA5]{2,5}’ )返回 ‘沙特阿拉伯’ Original: https://ww…

    数据库 2023年6月16日
    075
  • MySQL InnoDB 锁的二三事

    近日, 在一个小型项目中, 遇到了一个触及我知识盲区的bug. 项目用的是MySQL 5.7.25, 其中有一张表 config_data, 包含四个字段, id, name, v…

    数据库 2023年6月11日
    0116
  • IDEA springboot “spring-boot-maven-plugin“报红问题的解决方法

    使用环境 项目环境:Idea 2020.2.3、 Maven 3.6.3 、springboot 2.1.4 本人在创建springboot项目时spring-boot-maven…

    数据库 2023年6月14日
    084
  • Docker常用命令

    镜像:Docker 镜像是用于创建 Docker 容器的模板容器:容器是独立运行的一个或一组应用仓库:用来保存镜像,可以理解为代码控制中的代码仓库 一个仓库中包含多个镜像,以镜像为…

    数据库 2023年6月11日
    086
  • Oracle扩展表空间

    Oracle扩展表空间 前言: Oracle表空间扩展最大为32G,目前我还未找到可以打破限制的办法。 一、查看表空间信息和使用情况 查看表空间的名字及文件所在位置 — &amp…

    数据库 2023年6月16日
    0108
  • Java学习-第一部分-第二阶段-第六节:泛型

    泛型 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 泛型的理解和好处 看一个需求 请编写程序,在ArrayLi…

    数据库 2023年6月11日
    095
  • MySQL数据库-数据表(下)

    SELECT定义: SQL的SELECT语句可以实现对表的选择、投影及连接操作。即SELECT语句可以从一个或多个表中根据用户的需要从数据库中选出匹配的行和列,结果通常是生成一个临…

    数据库 2023年6月11日
    080
  • 精心整理16条MySQL使用规范,减少80%问题,推荐分享给团队

    上篇文章介绍了如何创建合适的MySQL索引,今天再一块学一下如何更规范、更合理的使用MySQL? 合理规范的使用MySQL,可以大大减少开发工作量和线上问题,并提升SQL查询性能。…

    数据库 2023年5月24日
    091
  • MySQL临时表

    MySQL中临时表主要有两类,包括外部临时表和内部临时表。外部临时表是通过语句create temporary table…创建的临时表,临时表只在本会话有效,会话断开…

    数据库 2023年6月9日
    096
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球