python open()函数的模式选择
python open()函数打开文件的模式详解
使用python处理文件时,避免不了要用到open()函数。我们今天主要讨论mode参数的区分。
fd = open('文件名(路径)’, mode=‘模式’)
先放上stockoverflow上一个哥么做的图,很清楚的从总体上概括了mode的区分;

图中展示了几种主要的模式,r(只读),r+(读写),w(只写), w+(读写), a(追加),a+(追加读)
从功能上分类:模式r只有读的功能,模式w和a只有写的功能,模式r+,w+和a+拥有读和写的功能。
读的功能就是,文件读入的对象可以使用read读取文件内容,不用使用write方法向写入内容;写的功能是反过来的,
可以使用write方法向写入内容,不用使用read读取文件内容,而读写就是这两个功能都有。
说到这里模式之间的区别还是不清楚。我们可以接着看下面这张图来进一步认识模式间的区别:
------------------| r r+ w w+ a a+
read | + + + +
write | + + + + +
write after seek | + + +
create | + + + +
truncate | + +
position at start |+ + + +
position at end | + +
1,r和r+的区别
先试着执行下面代码:
fd1 = open('newfile1.txt', mode='r')
fd2 = open('newfile2.txt', mode='r+')
如果你的工作目录下没有newfile.txt的话,运行这两行代码会出现FileNotFoundError报错信息,告诉
你“本路径下没有名叫newfile.txt的这个文件”,可以先创建一个名为newfile.txt的文件再执行上面代码就不会出问题了,
接着执行:
fd1.read()
fd2.read()
代码正常执行,返回空字符串;返回空字符串是因为你的文件里什么原本就什么就没有
接着执行:
fd1.write('this is test')
fd2.write('this is test')
第一行代码报错io.UnsupportedOperation: not writable,第二行代码正常运行,这里就是r和r+的区别了
r只有读的功能,r+既有读的功能,也有写的功能。
2,w和w+的区别
fd1 = open('newfile1.txt', mode='w')
fd2 = open('newfile2.txt', mode='w+')
fd1.write('this is test')
fd2.write('this is test')
fd1.read()
fd2.read()
与r和r+不同的是,无论当前目录下有没有名字为newfile.txt的文件,第一第二行都会正常运行,如果没有的话会在当前目录下创建一个名为newfile.txt的文件。
第三第四行也会正常运行,并将字符串写入文件,
第五行会报错:io.UnsupportedOperation: not readable,第六行会正常运行;这说明w和w+的区别是后者兼有读写功能,前这只有写的功能。
第六行虽然运行成功了,但是返回的确是空字符串,问题是我们在读取之前已经写入了内容呀?这
是因为写入结束之后我们的指针放在文件的末尾,这时候你读取的就是末尾之后的东西,也就是空
字符串了。可以尝试一下方法解决:
(1)先关闭文件再打开文件读取
fd2.close()
fd2 = open('newfile2.txt', mode='r')
fd2.read()
这样的话会正常显示我们之前写入的内容,这个方法未免太“折腾”了
(2)移动指针到文件开头再读取
fd2.seek(0)
fd2.read()
这样也可以成功读取刚写入的内容,seek(0)中的0表示offset=0,偏移0个字符,还有一个参数whence默认为0代表从文件开始位置,另外还有1代表当前位置,2代表文件末尾。
3,a和a+的区别:
模式a和a+之间的区别与w和w+之间的区别相同,在此不做赘述
4,a和w的区别
模式a和w都是写,区别就在于从哪里开始写,为了说明问题,我们先新创建两个文件new1.txt和new2.txt内容都为:
this is test1
this is test2
this is test3
然后执行下面代码:
fd1 = open('new1.txt', mode='w')
fd1.write('try to update')
fd1.seek(0)
fd1.read()
输出的结果为:
try to update
new1.txt文件中的原始内容被“冲洗”掉了!,我们再试试追加模式a
fd2 = open('new2.txt', mode='a')
fd2.write('try to update')
fd2.seek(0)
fd2.read()
返回的结果为:
this is test1
this is test2
this is test3
try to update
在文本的末尾添加了新写入的内容。上面就是模式w和a的区别,w在打开文件的
时候将指针移动到文件开头并截断(truncate)了之后的所有内容,截断即删除掉了。
而模式a开打文件的时候,其指针的位置是在文件的末尾。所以写入新内容的时候
这两种模式就会不一样。
值得一提的是,以模式a打开一个当前目录下不存在的文件也同样会新创建该文件。
5,r+和w+之间的比较
r+和w+之间是有必要拿出来比较一下的,因为他们的功能还是很像的,先说相同点
(1)都是可读可写的
(2)打开文件时指针都位于开始位置
再说不同点,创建两个新文件new3.txt和new4.txt内容都为:
this is one
this is two
this is three
尝试以下代码:
fd3 = open('new3.txt', mode='w+')
fd3.write('')
fd3.seek(0)
fd3.read()
返回的结果是:
1234 is one
this is two
this is three
仅仅是替换了new3.txt原来位置的字符,其他未变!我们再试试w+
fd4 = open('new4.txt', mode='w+')
fd4.write('')
fd4.seek(0)
fd4.read()
返回的结果为:
1234
结果一目了然了。
python open()函数的模式选择的更多相关文章
- Python Socket单线程+阻塞模式
Python之旅]第五篇(二):Python Socket单线程+阻塞模式 python Socket单线程 Socket阻塞模式 串行发送 摘要: 前面第五篇(一)中的一个Socket例子其实就是 ...
- python第六天 函数 python标准库实例大全
今天学习第一模块的最后一课课程--函数: python的第一个函数: 1 def func1(): 2 print('第一个函数') 3 return 0 4 func1() 1 同时返回多种类型时, ...
- Python 全栈开发四 python基础 函数
一.函数的基本语法和特性 函数的定义 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的.函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数 ...
- python设计模式之状态模式
python设计模式之状态模式 面向对象编程着力于在对象交互时改变它们的状态.在很多问题中,有限状态机(通常名为状态机)是一个非常方便的状态转换建模(并在必要时以数学方式形式化)工具.首先,什么是状态 ...
- python设计模式之命令模式
python设计模式之命令模式 现在多数应用都有撤销操作.虽然难以想象,但在很多年里,任何软件中确实都不存在撤销操作.撤销操作是在1974年引入的,但Fortran和Lisp分别早在1957年和195 ...
- python设计模式之建造者模式
python设计模式之建造者模式 建造者模式的适用范围:想要创建一个由多个部分组成的对象,而且它的构成需要一步接一步的完成.只有当各个部分都完成了,这个对象才完整.建造者模式表现为复杂对象的创建与 ...
- Python数学函数
1.Python数学函数 1.abs(x):取绝对值,内建函数 2.math.ceil(x):向上取整,在math模块中 3.cmp(x,y):如果 x < y ,返回-1:如果 x == y ...
- Python回调函数用法实例详解
本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...
- Python之函数与变量
本节内容 函数介绍及其作用 函数的定义与调用 函数的参数说明 全局变量与局部变量 值传递和引用传递 一.函数的介绍及其作用 编程语言中的函数与数学中的函数是有区别的:数学中的函数有参数(输入),就会有 ...
随机推荐
- springMVC的高级数据绑定,以及json交互,全局异常配置,
一.窄化请求映射 1.在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理. 如下: @Con ...
- WordPress版微信小程序开发系列(一):WordPress REST API
自动我发布开源程序WordPress版微信小程序以来,很多WordPress站长在搭建微信小程序的过程中会碰到各种问题来咨询我,有些问题其实很简单,只要仔细看看我写的文章,就可以自己解决.不过这些文章 ...
- 通过spark sql 将 hdfs上文件导入到mongodb
功能:通过spark sql 将hdfs 中文件导入到mongdo 所需jar包有:mongo-spark-connector_2.11-2.1.2.jar.mongo-java-driver-3.8 ...
- 七、XHTML介绍
XHTML简介 1.什么是XHTML? XHTML指的是可扩展超文本标记语言 XHTML与HTML4.01几乎是相同的 XHTML是更严格更纯净的HTML版本 XHTML得到所有主流浏览器的支持 2. ...
- Vue 父组件方法和参数传给子组件的方法
<template> <div class="content-item"> <!-- openWnd是父组件自身的方法,openDutyWnd是子组件 ...
- github 添加wiki
亲们支持我的新博客哦==>地址(以后更新会尽量在新博客更新,欢迎大家访问加入我的后宫w) ) 平时都是写readMe和docs的,一直眼瞎没有注意到有wiki这个功能 随便找一个写了wiki的看 ...
- Github 大牛封装 Python 代码,实现自动发送邮件只需三行代码
*注意:全文代码可左右滑动观看 在运维开发中,使用 Python 发送邮件是一个非常常见的应用场景.今天一起来探讨一下,GitHub 的大牛门是如何使用 Python 封装发送邮件代码的. 一般发邮件 ...
- Android 开发 框架系列 Android-Universal-Image-Loader 图片加载使用demo
Android-Universal-Image-Loader github地址:https://github.com/nostra13/Android-Universal-Image-Loader 加 ...
- C# 方法参数 out、ref、param 详解
ref和out都对函数参数采用引用传递形式——不管是值类型参数还是引用类型参数,并且定义函数和调用函数时都必须显示生命该参数为 ref/out形式.两者都可以使函数传回多个结果. ref 类似于 PH ...
- 前端--vue框架
1.下载 查看已安装好的版本 -------渐进式的JS框架--------- vue是什么 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架 ...