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 pickle模块用法实例分析
May 27 Python
python生成随机密码或随机字符串的方法
Jul 03 Python
如何使用python爬取csdn博客访问量
Feb 14 Python
Python 获取当前所在目录的方法详解
Aug 02 Python
Python实现的json文件读取及中文乱码显示问题解决方法
Aug 06 Python
利用Django-environ如何区分不同环境
Aug 26 Python
python各类经纬度转换的实例代码
Aug 08 Python
浅谈Python 敏感词过滤的实现
Aug 15 Python
Python Tensor FLow简单使用方法实例详解
Jan 14 Python
Python3.7实现验证码登录方式代码实例
Feb 14 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
Apr 24 Python
Python 程序员必须掌握的日志记录
Aug 17 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
星际争霸秘籍
2020/03/04 星际争霸
PHP iconv 解决utf-8和gb2312编码转换问题
2010/04/12 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
jQuery插件slider实现拖动滑块选取价格范围
2015/04/30 Javascript
jQuery获取浏览器类型和版本号的方法
2016/07/05 Javascript
超详细的JS弹出窗口代码大全
2020/04/18 Javascript
js正则表达式验证表单【完整版】
2017/03/06 Javascript
使用JavaScript实现点击循环切换图片效果
2017/09/03 Javascript
AngularJS中下拉框的基本用法示例
2017/10/11 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
Vue cli构建及项目打包以及出现的问题解决
2018/08/27 Javascript
Vue为什么要谨慎使用$attrs与$listeners
2020/08/27 Javascript
新手该如何学python怎么学好python?
2008/10/07 Python
Python实现统计文本文件字数的方法
2017/05/05 Python
python实现数据预处理之填充缺失值的示例
2017/12/22 Python
Python基础之高级变量类型实例详解
2020/01/03 Python
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
室内设计实习自我鉴定
2013/09/25 职场文书
社会保险接收函
2014/01/12 职场文书
助人为乐表扬信范文
2014/01/14 职场文书
初一地理教学反思
2014/01/16 职场文书
村官工作鉴定评语
2014/01/27 职场文书
合作协议书范本
2014/04/17 职场文书
教师爱岗敬业演讲稿
2014/05/05 职场文书
新疆民族团结演讲稿
2014/08/27 职场文书
中秋节寄语2015
2015/03/24 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书
python3 删除所有自定义变量的操作
2021/04/08 Python
试了下Golang实现try catch的方法
2021/07/01 Golang
关于@OnetoMany关系映射的排序问题,使用注解@OrderBy
2021/12/06 Java/Android
SSM项目使用拦截器实现登录验证功能
2022/01/22 Java/Android