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虚拟环境项目实例
Nov 20 Python
python读取文件名称生成list的方法
Apr 27 Python
对python中if语句的真假判断实例详解
Feb 18 Python
python实现QQ批量登录功能
Jun 19 Python
python代理工具mitmproxy使用指南
Jul 04 Python
Django Rest framework认证组件详细用法
Jul 25 Python
Python+appium框架原生代码实现App自动化测试详解
Mar 06 Python
Python计算指定日期是今年的第几天(三种方法)
Mar 26 Python
python实现简单坦克大战
Mar 27 Python
Python坐标轴操作及设置代码实例
Jun 04 Python
在Keras中实现保存和加载权重及模型结构
Jun 15 Python
Python+OpenCV图像处理——实现直线检测
Oct 23 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的历史和优缺点
2006/10/09 PHP
php使用curl模拟登录后采集页面的例子
2013/11/04 PHP
php带抄送和密件抄送的邮件发送方法
2015/03/20 PHP
[原创]PHP简单开启curl的方法(测试可行)
2016/01/11 PHP
Laravel框架验证码类用法实例分析
2019/09/11 PHP
JavaScript 页面编码与浏览器类型判断代码
2010/06/03 Javascript
通过js获取div的background-image属性
2013/10/15 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
2015/10/23 Javascript
利用Javascript仿Excel的数据透视分析功能
2016/09/07 Javascript
npm国内镜像 安装失败的几种解决方案
2017/06/04 Javascript
浅析node应用的timing-attack安全漏洞
2018/02/28 Javascript
JavaScript计算正方形面积
2019/11/26 Javascript
[04:00]黄浦江畔,再会英雄——完美世界DOTA2 TI9应援视频
2019/07/31 DOTA
Python类的用法实例浅析
2015/05/27 Python
Python通过future处理并发问题
2017/10/17 Python
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
python障碍式期权定价公式
2019/07/19 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
HTML5拖放API实现拖放排序的实例代码
2017/05/11 HTML / CSS
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
俄罗斯最大的在线手表商店:Bestwatch.ru
2020/01/11 全球购物
Zalando Lounge瑞士:时尚与生活方式购物俱乐部
2020/03/12 全球购物
学生干部学习的自我评价
2014/02/18 职场文书
战略合作意向书范本
2014/04/01 职场文书
六年级学生评语
2014/04/22 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
防汛工作情况汇报
2014/10/28 职场文书
校本研修个人总结
2015/02/28 职场文书
幼儿园开学通知
2015/04/24 职场文书
go 原生http web 服务跨域restful api的写法介绍
2021/04/27 Golang
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python
python playwright 自动等待和断言详解
2021/11/27 Python
解决persistence.xml配置文件修改存放路径的问题
2022/02/24 Java/Android
关于Python中进度条的六个实用技巧分享
2022/04/05 Python