Python文件打开方式实例详解【a、a+、r+、w+区别】


Posted in Python onMarch 30, 2019

本文实例讲述了Python文件打开方式。分享给大家供大家参考,具体如下:

第一步 排除文件打开方式错误:

r只读,r+读写,不创建

w新建只写,w+新建读写,二者都会将文件内容清零

(以w方式打开,不能读出。w+可读写)

w+与r+区别:

r+:可读可写,若文件不存在,报错;w+: 可读可写,若文件不存在,创建

r+与a+区别:

fd = open("1.txt",'w+')
fd.write('123')
fd = open("1.txt",'r+')
fd.write('456')
fd = open("1.txt",'a+')
fd.write('789')

结果:

456789

说明r+进行了覆盖写。

以a,a+的方式打开文件,附加方式打开

a:附加写方式打开,不可读;a+: 附加读写方式打开)

以 'U' 标志打开文件, 所有的行分割符通过 Python 的输入方法(例#如 read*() ),返回时都会被替换为换行符\n. ('rU' 模式也支持 'rb' 选项) . 

r和U要求文件必须存在

不可读的打开方式:w和a

若不存在会创建新文件的打开方式:a,a+,w,w+

>>> fd=open(r'f:\mypython\test.py','w') #只读方式打开,读取报错
>>> fd.read()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
IOError: File not open for reading
>>> fd=open(r'f:\mypython\test.py','a')#附加写方式打开,读取报错
>>> fd.read()
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
IOError: File not open for reading
>>>

2.正确读写方式打开,出现乱码

>>> fd=open(r'f:\mypython\test.py','a+')
>>> fd.write('123')
>>> fd.read()
>>> fd.close()

close之前,手动打开文件,什么都没写入;close后,手动打开文件,乱码:123嚅?     

原因分析:指针问题。open()以a+模式开启了一个附加读写模式的文件,由于是a,所以指针在文件末尾。此时如果做read(),则Python发现指针位置就是EOF,读取到空字符串。

在写入123之后,指针的位置是4,仍然是文件尾,文件在内存中是123[EOF]。

但看起来read()的时候,Python仍然去试图在磁盘的文件上,将指针从文件头向后跳3,再去读取到EOF为止。

也就是说,你实际上是跳过了该文件真正的EOF,为硬盘底层的数据做了一个dump,一直dump到了一个从前存盘文件的[EOF]为止。所以最后得到了一些根本不期待的随机乱字符,而不是编码问题造成的乱码。

解决方案:读取之前将指针重置为文件头(如果读取之后重置再读,无效)

>>> fd=open(r'f:\mypython\test.py','a+')
>>> fd.seek(0)
>>> fd.read()
'123'#顺利读出

3.文件里有内容,却读出空字符

>>> fd=open(r'f:\mypython\test.py','w+') #清空内容,重新写入
>>> fd.write('456')
>>> fd.flush()#确定写入,此时文件内容为“456”
>>> fd.read()
'' #读出空

原因:同样是指针问题,写入后指针指向末尾[EOF],因此读出空

解决方案一、调用close后重新打开,指针位于开头。(r,r+,a+,U都可以,注意不要用w,w+,a打开)

>>> fd.close()
>>> fd=open(r'f:\mypython\test.py','a+')
>>> fd.read()
'456'
>>> fd.close()
>>> fd=open(r'f:\mypython\test.py','r+')
>>> fd.read()
'456'
>>> fd.close()
>>> fd=open(r'f:\mypython\test.py','r')
>>> fd.read()
'456'
>>> fd.close()
>>> fd=open(r'f:\mypython\test.py','U')
>>> fd.read()
'456'

解决方案二、调用seek指向开头

>>> fd=open(r'f:\mypython\test.py','w+')
>>> fd.write('456')
>>> fd.seek(0)
>>> fd.read()
'456'

seek函数

seek(offset[, whence]) ,offset是相对于某个位置的偏移量。位置由whence决定,默认whence=0,从开头起;whence=1,从当前位置算起;whence=2相对于文件末尾移动,通常offset取负值。

4. 记得close()关闭

当我们写文件时,操作系统往往不会立刻把数据写入磁盘,而是放到内存缓存起来,空闲的时候再慢慢写入。只有调用close()方法时,操作系统才保证把没有写入的数据全部写入磁盘。忘记调用close()的后果是数据可能只写了一部分到磁盘,剩下的丢失了。所以,还是用with语句来得保险:

with open('/Users/michael/test.txt', 'w') as f:
  f.write('Hello, world!')

看评论:对于'r+'来说,如果先读取了内容,再写入的话就变成了追加的模式,如果直接写入内容,就是覆盖了

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python2.7 mayavi 安装图文教程(推荐)
Jun 22 Python
python使用suds调用webservice接口的方法
Jan 03 Python
pyqt5实现俄罗斯方块游戏
Jan 11 Python
对Python协程之异步同步的区别详解
Feb 19 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
Mar 29 Python
Python 运行.py文件和交互式运行代码的区别详解
Jul 02 Python
Numpy与Pytorch 矩阵操作方式
Dec 27 Python
Python文件操作方法详解
Feb 09 Python
python输入一个水仙花数(三位数) 输出百位十位个位实例
May 03 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
Jul 02 Python
python实现AdaBoost算法的示例
Oct 03 Python
Python从文件中读取数据的方法步骤
Nov 18 Python
Python函数装饰器常见使用方法实例详解
Mar 30 #Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
Mar 30 #Python
Python函数的参数常见分类与用法实例详解
Mar 30 #Python
Python实现定时执行任务的三种方式简单示例
Mar 30 #Python
详解Python解决抓取内容乱码问题(decode和encode解码)
Mar 29 #Python
详解python读取和输出到txt
Mar 29 #Python
Python实现账号密码输错三次即锁定功能简单示例
Mar 29 #Python
You might like
php中长文章分页显示实现代码
2012/09/29 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
PHP基于自定义函数实现的汉字转拼音功能实例
2017/09/30 PHP
json2.js的初步学习与了解
2011/10/06 Javascript
JavaScript常用对象的方法和属性小结
2012/01/24 Javascript
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
JS实现标签页效果(配合css)
2013/04/03 Javascript
extjs中form与grid交互数据(record)的方法
2013/08/29 Javascript
fckeditor粘贴Word时弹出窗口取消的方法
2014/10/30 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
js实现的鼠标滚轮滚动切换页面效果(类似360默认页面滚动切换效果)
2016/01/27 Javascript
详解JavaScript的内置对象
2016/12/07 Javascript
nodejs开发——express路由与中间件
2017/03/24 NodeJs
ES5学习教程之Array对象
2017/04/01 Javascript
JavaScript实现选中文字提示新浪微博分享效果
2017/06/15 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
js实现黑白div块画空心的图形
2018/12/13 Javascript
vue自定义switch开关组件,实现样式可自行更改
2019/11/01 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
Vue如何实现监听组件原生事件
2020/07/03 Javascript
Vue实现开关按钮拖拽效果
2020/09/22 Javascript
详解Python中用于计算指数的exp()方法
2015/05/14 Python
Python3.4编程实现简单抓取爬虫功能示例
2017/09/14 Python
Python 字符串与数字输出方法
2018/07/16 Python
Python时间和字符串转换操作实例分析
2019/03/16 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
css3中背景尺寸background-size详解
2014/09/02 HTML / CSS
HTML5中语义化 b 和 i 标签
2008/10/17 HTML / CSS
不开辟用于交换数据的临时空间,如何完成字符串的逆序
2012/12/02 面试题
中秋节超市促销方案
2014/01/30 职场文书
2014年员工工作总结范文
2014/11/18 职场文书
解除同居协议书
2015/01/29 职场文书
亮剑观后感
2015/06/05 职场文书
大学生如何逃脱“毕业季创业队即散伙”魔咒?
2019/08/19 职场文书
青岛市的收音机研制与生产
2022/04/07 无线电