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 相关文章推荐
Python函数中*args和**kwargs来传递变长参数的用法
Jan 26 Python
python进程管理工具supervisor的安装与使用教程
Sep 05 Python
python爬虫的数据库连接问题【推荐】
Jun 25 Python
python保存文件方法小结
Jul 27 Python
Python正则表达式指南 推荐
Oct 09 Python
pyqt5 QProgressBar清空进度条的实例
Jun 21 Python
使用Python画股票的K线图的方法步骤
Jun 28 Python
Python使用Tkinter实现滚动抽奖器效果
Jan 06 Python
python定义类self用法实例解析
Jan 22 Python
Python 如何实现访问者模式
Jul 28 Python
Django admin组件的使用
Oct 24 Python
Django celery异步任务实现代码示例
Nov 26 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 split汉字
2009/06/05 PHP
php实现通过ftp上传文件
2015/06/19 PHP
PHP使用Pear发送邮件(Windows环境)
2016/01/05 PHP
PHP面向对象程序设计子类扩展父类(子类重新载入父类)操作详解
2019/06/14 PHP
JS中showModalDialog 的使用解析
2013/04/17 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
jQuery动画效果-slideUp slideDown上下滑动示例代码
2013/08/28 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
多个checkbox被选中时如何判断是否有自己想要的
2014/09/22 Javascript
JS模拟Dialog弹出浮动框效果代码
2015/10/16 Javascript
Jquery和JS获取ul中li标签的实现方法
2016/06/02 Javascript
JS实现微信弹出搜索框 多条件查询功能
2016/12/13 Javascript
浅谈关于angularJs中使用$.ajax的注意点
2017/08/12 Javascript
jQuery 点击获取验证码按钮及倒计时功能
2018/09/20 jQuery
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
微信小程序嵌入腾讯视频源过程详解
2019/08/08 Javascript
Python连接mysql数据库的正确姿势
2016/02/03 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
2018/01/10 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
详解tensorflow载入数据的三种方式
2018/04/24 Python
详解Python with/as使用说明
2018/12/13 Python
使用python采集Excel表中某一格数据
2020/05/14 Python
Manduka官网:瑜伽垫、瑜伽毛巾和服装
2018/07/02 全球购物
英国排名第一的礼品体验公司:Red Letter Days
2018/08/16 全球购物
REISS美国官网:伦敦最受欢迎的时尚品牌
2019/08/16 全球购物
半年思想汇报
2013/12/30 职场文书
校园报刊亭创业计划书
2014/01/02 职场文书
2014年创先争优活动总结
2014/05/04 职场文书
2015毕业生自我评价范文
2015/03/02 职场文书
学校青年志愿者活动总结
2015/05/06 职场文书
三八妇女节主持词
2015/07/04 职场文书
2016年庆“七一”主题党日活动总结
2016/04/05 职场文书
导游词范文之颐和园/重庆/云台山
2019/09/10 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang
OpenCV-Python实现图像平滑处理操作
2021/06/08 Python
Java实现二分搜索树的示例代码
2022/03/17 Java/Android