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自动化构建工具scons使用入门笔记
Mar 10 Python
Python实现针对给定字符串寻找最长非重复子串的方法
Apr 21 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
May 30 Python
详解windows python3.7安装numpy问题的解决方法
Aug 13 Python
Python代码打开本地.mp4格式文件的方法
Jan 03 Python
python 杀死自身进程的实现方法
Jul 01 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
Dec 11 Python
Jupyter notebook如何修改平台字体
May 13 Python
关于tensorflow softmax函数用法解析
Jun 30 Python
Python类绑定方法及非绑定方法实例解析
Oct 09 Python
python 基于opencv 实现一个鼠标绘图小程序
Dec 11 Python
Elasticsearch 基本查询和组合查询
Apr 19 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(3) php 函数
2010/02/15 PHP
wamp服务器访问php非常缓慢的解决过程
2015/07/01 PHP
实例讲解PHP设计模式编程中的简单工厂模式
2016/02/29 PHP
PDO::rollBack讲解
2019/01/29 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
2014/08/05 Javascript
纯Javascript实现ping功能的方法
2015/03/20 Javascript
纯JS实现图片验证码功能并兼容IE6-8(推荐)
2017/04/19 Javascript
微信小程序自定义导航隐藏和显示功能
2017/06/13 Javascript
vue生成随机验证码的示例代码
2017/09/29 Javascript
Node.js开发之套接字(socket)编程入门示例
2019/11/05 Javascript
Python 变量类型及命名规则介绍
2013/06/08 Python
Python中的枚举类型示例介绍
2019/01/09 Python
PyQt5重写QComboBox的鼠标点击事件方法
2019/06/25 Python
深入了解python中元类的相关知识
2019/08/29 Python
Python基本语法之运算符功能与用法详解
2019/10/22 Python
python 输出列表元素实例(以空格/逗号为分隔符)
2019/12/25 Python
Python第三方包之DingDingBot钉钉机器人
2020/04/09 Python
使用OpenCV实现道路车辆计数的使用方法
2020/07/15 Python
python实现图片转换成素描和漫画格式
2020/08/19 Python
html+js 实现markdown编辑器效果
2019/10/23 HTML / CSS
移动端HTML5 input常见问题(小结)
2020/09/28 HTML / CSS
摩顿布朗英国官方网上商店:奢华沐浴、身体和头发护理
2016/10/29 全球购物
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
电话销售经理岗位职责
2013/12/07 职场文书
教师队伍管理制度
2014/01/14 职场文书
经贸专业毕业生求职信范文
2014/05/01 职场文书
会计学自荐信
2014/06/03 职场文书
考试作弊检讨书
2014/10/21 职场文书
关于远足的感想
2015/08/10 职场文书
小学体育教学随笔
2015/08/14 职场文书
机关干部纪律作风整顿心得体会
2016/01/23 职场文书
2016年小学圣诞节活动总结
2016/03/31 职场文书
浅谈移动端中的视口(viewport)的具体使用
2021/04/13 HTML / CSS
用Python进行栅格数据的分区统计和批量提取
2021/05/27 Python