一、 引言
在操作一个文件前,大部分情况需要先打开文件,才能进行,在Python中使用内置函数open来打开一个文件。open函数是Python的一个内置函数,io模块 定义的函数open是该内置函数的同义词(这是Python官网中关于io.open函数的说明,原文如下: “This is an alias for the builtin open() function”。这里的this是指io.open),open函数相关常规的操作方式与C语言的fopen函数类似度比较高。

二、 函数调用语法及参数释义
1. 语法:
open(file, mode =‘r’, buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

2. 参数说明:
open函数的参数老猿认为重要的就是file、mode,这个与c语言的fopen的参数非常类似,其他参数老猿就不展开细说。
1)file参数:
 Python官网是这样说的:“file 是一个 path-like object,表示将要打开的文件的路径(绝对路径或者当前工作目录的相对路径),也可以是要被封装的整数类型文件描述符。(如果是文件描述符,它会随着返回的 I/O 对象关闭而关闭,除非 closefd 被设为 False 。)”。
 像open()函数返回的这种有个read()方法的对象,在Python中统称为file-like Object。除了file外,还可以是内存的字节流,网络流,自定义流等等。file-like Object不要求从特定类继承,只要写个read()方法就行。例如StringIO就是在内存中创建的file-like Object,常用作临时缓冲
 对初学者来说,理解其为可以带路径的文件名就可以了,注意如果是windows的路径带有反斜杠,需要前面再加反斜杠,防止被Python转义,其实最好的办法就是用原始字符串,即在字符串前面加字母r。
 如果是文件描述符,该文件描述符应是一个通过os.open打开文件返回的文件描述符。关于文件描述符老猿将在后面的文章单独介绍,大家也可以在网上自己查资料。

2)mode:
文件打开的读写模式,是一个可选字符串,用于指定打开文件的模 式,默认值是 ‘r’。相关取值及对应模式如下:

老猿认为该模式与 C语言中的文件模式很像,主要由两种属性组合而成:
 文件的类型:分为文本文件、二进制文件,对应模式中的:t、b。其中t模式是缺省模式;
 操作的类型:读、写、追加、更新模式,对应模式中的:r、w、a、x、+,分别对应:只读、写、追加写、排它性创建写、更新,其中r模式是缺省模式,w模式在文件存在时会截断文件清空内容将文件重置为长度为0的空文件,不存在时会创建文件,a模式在文件存在时不会清空内容,文件不存在时会创建文件,x模式是新加的模式,当一个文件已经存在时,以x模式打开会引发FileExistsError,文件不存在时会创建文件执行写入。
注意:以上模式除追加模式外打开文件写入内容时,在没有指定文件内容写入位置的情况下,写入的地方都是从文件开头的位置开始写入,并且在文件已经存在的情况下,写入内容会覆盖文件开头对应长度的内容。追加模式写入都会追加到文件末尾。
 更新模式,实际上就是读写模式,对应模式中的+,在指定了r模式的情况下启用更新模式,则文件内容还可读写,但x模式在文件已经存在的情况下不能使用更新模式。’'r+'和’w+‘之间有个重要差别:后者截断文件,而前者不会这样做。
 默认模式为’rt’,这意味着将把文件视为经过编码的Unicode文本,因此将自动执行解码和编码,且默认使用UTF-8编码。要指定其他编码和Unicode错误处理策略,可使用关键字参数encoding和errors。

3)buffering:
是可选参数,用于设置缓冲策略。传递0以关闭缓冲(仅允许在二进制模式下),1选择行缓冲(仅在文本模式下可用),并且>1的整数以指示固定大小的块缓冲区的大小(以字节为单位)。如果没有给出 buffering 参数或值为-1,则默认缓冲策略如下:
 二进制文件以固定大小的块进行缓冲;缓冲区的大小尝试底层设备的“块大小”或使用 io.DEFAULT_BUFFER_SIZE参数定义的大小。在许多系统上,缓冲区的长度通常为4096或8192字节。
 “交互式”文本文件( isatty() 返回 True 的文件)使用行缓冲。其他文本文件使用上述用于二进制文件的策略。

4)encoding:
在文本模式,如果 encoding 没有指定,则根据平台环境来决定使用本地编码,本地编码可以通过import locale模块后,使用 locale.getpreferredencoding(False) 来获取。二进制文件不需要设置 encoding参数;

5)errors:
是一个可选的字符串参数,用于指定如何处理编码和解码错误,由于二进制文件不能指定编码方式,因此该参数不能在二进制模式下使用。错误类型包括:
• ‘strict’ :如果存在编码错误,会引发 ValueError 异常。 默认值 None 具有相同的效果。
• ‘ignore’: 忽略错误,请注意,忽略编码错误可能会导致数据丢失。
• ‘replace’: 会将替换标记(例如 ‘?’ )插入有错误数据的地方。
• ‘surrogateescape’ :将表示任何不正确的字节作为Unicode专用区中的代码点,范围从U+DC80到U+DCFF。当在写入数据时使用 surrogateescape 错误处理程序时,这些私有代码点将被转回到相同的字节中。这对于处理未知编码的文件很有用。
• ‘xmlcharrefreplace’:只有在写入文件时才支持 ,编码不支持的字符将替换为相应的XML字符引用 &#nnn;。
• ‘backslashreplace’: 用Python的反向转义序列替换格式错误的数据。
• ‘namereplace’ 在文件写入时用 \N{…} 转义序列替换不支持的字符。

6)newline:
换行符,用于 控制识别换行符和换行符读写的转换方式,它仅适用于文本模式,可以是 None、空字符串’’、’\n’、’\r’、 ‘\r\n’以及其他合法的字符串。它的工作原理:
• 官网翻译:“从流中读取输入时,如果 newline 为 None,则启用通用换行模式。输入中的行可以以 ‘\n’,’\r’ 或 ‘\r\n’ 结尾,这些行结尾符被转换成 ‘\n’ 。如果它是 ‘‘或引号标识的一个字符串,则启用通用换行模式,但行结尾将直接返回给访问者。如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且行结尾将返回给给文件访问方”。老猿理解为:
 所有换行符都用来判断一个文本的行是否结束,差别是关于换行符读取后怎么进行转换存入到读入的缓冲中;
 如果换行符是通用换行模式,则’\n’,’\r’ 或 ‘\r\n’都可以作为行 结尾,并且读取行时,这些符号被转换成’\n’读入缓冲中;
 如果该处填空字符串,则读取行的处理同’\n’,’\r’ 或 ‘\r\n’ ,只是’\n’,’\r’ 或 '\r\n’这些换行符不会进行转换,直接原样读入缓冲中。
• 将输出写入文件流时,如果 newline 为 None,则写入的任何 ‘\n’ 字符都将转换为系统默认行分隔符 os.linesep。如果 newline 是 ‘’ 或 ‘\n’,则不进行转换直接写入。如果 newline 是任何其他合法值,则写入的任何 ‘\n’ 字符将被转换为给定的字符串。

7)closefd:
这个参数老猿没有深入研究,大致认为是在第一个参数file不是文件名而是一个使用os.open打开的文件描述符时,在此指定当本open函数返回的文件对象关闭后,对应的文件描述符文件是否关闭,如果该参数为True则关闭传入进来的文件描述符,否则不关闭,该参数在第一个参数file为文件名时没有意义;
这个参数老猿没有完全弄明白作用,老猿猜想有种场景可以使用,就是第一个参数是通过外部接口传入的file是一个文件描述符,此时为了兼容通过文件名访问的功能,因此需要将其转换为文件对象进行操作,需要使用该参数确保传入的文件描述符不会关闭,以便外部接口后续能继续正常运行。

8)opener:
这个参数老猿没有深入研究,它是一个可调用的函数,该函数的目的是为了定制自己的文件打开操作函数,且这个文件打开操作函数的参数是open函数的第一个参数file和第二个参数mode,返回值是一个文件描述符(即通过os.open返回的类型),系统默认是调用的就是os.open,所以该参数传os.open与传None是相同的结果。
老猿没有弄明白这个参数opener的作用,可能在操作者需要深度控制文件访问逻辑时使用。

三、 函数返回结果
如果文件成功打开, open() 函数所返回的 file object 类型取决于所用模式。 当使用 open() 以文本模式 (‘w’, ‘r’, ‘wt’, ‘rt’ 等) 打开文件时,它将返回 io.TextIOBase 的一个子类 。 当使用缓冲以二进制模式打开文件时,返回的类是 io.BufferedIOBase 的一个子类。 具体的类会有多种:在只读的二进制模式下,它将返回 io.BufferedReader;在写入二进制和追加二进制模式下,它将返回 io.BufferedWriter,而在读/写模式下,它将返回 io.BufferedRandom。 当禁用缓冲时,则会返回原始流,即 io.RawIOBase 的一个子类 io.FileIO。
如果该文件不能打开,则触发 OSError及相关异常。

本节详细介绍了Python内置函数open(同时也是io.open的同义词)的相关调用语法及参数,相关参数有些内容老猿也没有完全弄清楚。
老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython
请大家多多支持,点赞、评论和加关注!谢谢!

第9.2节 Python的文件打开函数open详解相关推荐

  1. 第9.1节 Python的文件打开函数open简介

    一.语法简介 函数基本使用语法:open(文件名,文件打开模式='rt') 其中: 1.文件名为可带路径的文件名,注意windows下路径的反斜杠会被作为转义符处理,因此可以采用前面再加反斜杠或使用原 ...

  2. python打开文件的语法_python27语法Python文件打开方式实例详解【a、a+、r+、w+区别】...

    本文实例讲述了Python文件打开方式.分享给大家供大家参考,具体如下: 第一步 排除文件打开方式错误: r只读,r+读写,不创建 w新建只写,w+新建读写,二者都会将文件内容清零 (以w方式打开,不 ...

  3. c语言 freopen txt_C语言文件操作函数freopen详解

    C语言文件操作函数freopen详解 今天做USACO 用到了文件的操作. 之前做USACO只是格式化的.些 写 freopen("xxx.in","r",st ...

  4. linux查看文件打开限制,Linux最大文件打开数使用经验详解

    首先普及几个知识:Linux下一切都是文件,包括输入输出设备.网络连接.socket.管道等 与文件打开数最相关的是文件描述符(有的人喜欢称作文件标识符,英文为file descriptor),文件打 ...

  5. python中的iloc函数_详解pandas中利用DataFrame对象的.loc[]、.iloc[]方法抽取数据

    pandas的DataFrame对象,本质上是二维矩阵,跟常规二维矩阵的差别在于前者额外指定了每一行和每一列的名称.这样内部数据抽取既可以用"行列名称(对应.loc[]方法)",也 ...

  6. python——xlsx文件的读写操作详解

    本文对xlsx文件的读写使用以下的库,已安装的可以忽略: """ 需安装的库文件: pip install xlrd==1.2.0 pip install pywin32 ...

  7. python数据库文件读写(超详解)

    目录 一:文件读写流程 二:函数open()中参数mode最常见的6种模式 三:读取文件三大方法的区别 四:超大文件高效处理 思维导图: 1.文件读写流程:                 (1):第 ...

  8. python数据类型怎么打开_python数据类型详解

    目录 1.字符串 2.布尔类型 3.整数 4.浮点数 5.数字 6.列表 7.元组 8.字典 9.日期 1.字符串 1.1.如何在Python中使用字符串 a.使用单引号(') 用单引号括起来表示字符 ...

  9. python filter()和reduce()函数用法详解

    一.filter() 在Python内建函数中,有一个和map()函数用法类似.却可以用来过滤元素的迭代函数,这个函数就是filter().它的函数原型是:filter(function,iteara ...

最新文章

  1. Java项目:在线高中考试系统(java+SSM+Jsp+Mysql+Maven)
  2. linux c select 服务器源码 简介
  3. Python+人工智能的超强组合,再不学就跟不上时代啦!
  4. Git 的安装和创建版本库 。
  5. TimeSpan asp.net中时间的运算
  6. 语义分割系列3-SegNet(pytorch实现)
  7. vs2015调试iisexpress无法启动的问题解决方案整理
  8. 爬虫进阶之路---处理滑块验证码(以解决极验平台的滑动验证码为例[附带本项目源码!],通过率百分之九十以上!!!)
  9. 优酷1080p的kux格式文件转码
  10. 2018年国考行测错题集(省级)
  11. python从入门到实践 练习题雨滴下落--我的下落时全都连在一起了---已解决
  12. 创建个人博客只需五步骤——小白都能看会的详细过程,教你如何白嫖阿里云服务器
  13. Representation Learning with Contrastive Predictive Coding 论文阅读
  14. Spring源码系列(十三)——Spring源码编译及详细注解
  15. 为什么Rust语言正在兴起
  16. 学习记录1.0(基础算法)
  17. 什么是大数据采集?大数据采集的过程是什么?
  18. PDM信号与PCM信号
  19. node.js使用WebTorrent构造流式torrent客户端
  20. UE GamePlay框架(一) GameInstance、SaveGame

热门文章

  1. oracle中bulk,Oracle数据库之FORALL与BULK COLLECT语句
  2. 设置 Scrapyd 在后台运行
  3. 微信小程序提交表单清空输入框
  4. 3GGO够酷够绚,但仅支持Nokia
  5. 大学生就业寒冬中的冬日暖阳在哪?-金旭亮
  6. Navicat for MySQL 数据库应用 (三)
  7. 2022年9月19日--9月25日(ue4热更新视频教程为主,本周10小时。合计1592小时,剩余8408小时)
  8. 在淘宝开放平台创建应该步骤
  9. 导航标签位于左侧的纵向选项卡
  10. 移动布局之rem适配布局、Bootstrap前端开发框架