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的Bottle框架中返回静态文件和JSON对象的方法
Apr 30 Python
python框架django基础指南
Sep 08 Python
使用Python来开发微信功能
Jun 13 Python
Python实现iOS自动化打包详解步骤
Oct 03 Python
对python中字典keys,values,items的使用详解
Feb 03 Python
Python批量查询关键词微信指数实例方法
Jun 27 Python
浅谈Python访问MySQL的正确姿势
Jan 07 Python
Python模块相关知识点小结
Mar 09 Python
django model通过字典更新数据实例
Apr 01 Python
浅谈python出错时traceback的解读
Jul 15 Python
Python 读取位于包中的数据文件
Aug 07 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
Sep 24 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抽象工厂模式(Elgg)
2010/03/21 PHP
PHP对MongoDB[NoSQL]数据库的操作
2013/03/01 PHP
php ios推送(代码)
2013/07/01 PHP
php+mysql大量用户登录解决方案分析
2014/12/29 PHP
php实现面包屑导航例子分享
2015/12/19 PHP
php编译安装php-amq扩展简明教程
2016/06/25 PHP
PHP 7.1新特性的汇总介绍
2016/12/16 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
2019/07/18 PHP
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
JS加jquery简单实现标签元素的显示或隐藏
2013/09/23 Javascript
js实现俄罗斯方块小游戏分享
2014/01/31 Javascript
Document.location.href和.replace的区别示例介绍
2014/03/04 Javascript
jQuery简单实现仿京东商城的左侧菜单效果代码
2015/09/09 Javascript
jquery插件uploadify实现带进度条的文件批量上传
2015/12/13 Javascript
javascript实现随机显示星星特效
2016/01/28 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
WebSocket的通信过程与实现方法详解
2018/04/29 Javascript
webpack分离css单独打包的方法
2018/06/12 Javascript
vue组件表单数据回显验证及提交的实例代码
2018/08/30 Javascript
JavaScript ES6中的简写语法总结与使用技巧
2018/12/30 Javascript
vue自定义指令directive的使用方法
2019/04/07 Javascript
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
2014/07/04 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
python 直接赋值和copy的区别详解
2019/08/07 Python
Python 从subprocess运行的子进程中实时获取输出的例子
2019/08/14 Python
Django自带日志 settings.py文件配置方法
2019/08/30 Python
打印tensorflow恢复模型中所有变量与操作节点方式
2020/05/26 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
Myprotein葡萄牙官方网站:英国优质运动营养品牌
2016/09/12 全球购物
伦敦剧院门票:London Theatre Direct
2018/11/21 全球购物
战略合作协议书范本
2014/04/18 职场文书
商务英语专业求职信
2014/06/26 职场文书
2016小学优秀教师先进事迹材料
2016/02/26 职场文书
导游词之淮安明祖陵
2019/11/25 职场文书