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中的变量、引用、拷贝和作用域的问题
Apr 07 Python
深入浅析Python中join 和 split详解(推荐)
Jun 30 Python
python字典键值对的添加和遍历方法
Sep 11 Python
matplotlib subplots 调整子图间矩的实例
May 25 Python
python实现多人聊天室
Mar 31 Python
Python实现注册、登录小程序功能
Sep 21 Python
Python rstrip()方法实例详解
Nov 11 Python
python从入门到精通 windows安装python图文教程
May 18 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
Jun 11 Python
python获取百度热榜链接的实例方法
Aug 25 Python
python 基于UDP协议套接字通信的实现
Jan 22 Python
利用python进行数据加载
Jun 20 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 最大运行时间 max_execution_time修改方法
2010/03/08 PHP
PHP编写登录验证码功能 附调用方法
2016/05/19 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
php redis实现文章发布系统(用户投票系统)
2017/03/04 PHP
php输出形式实例整理
2020/05/05 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
2013/05/27 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
为什么Node.js会这么火呢?Node.js流行的原因
2014/12/01 Javascript
BootStrap的Datepicker控件使用心得分享
2016/05/25 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
javascript验证内容为数字以及长度为10的简单实例
2016/08/20 Javascript
详细介绍RxJS在Angular中的应用
2017/09/23 Javascript
JavaScript累加、迭代、穷举、递归等常用算法实例小结
2018/05/08 Javascript
Promise.all中对于reject的处理方法
2018/08/01 Javascript
Angular(5.2-&gt;6.1)升级小结
2018/12/27 Javascript
关于vue状态过渡transition不起作用的原因解决
2019/04/09 Javascript
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
python自动发邮件库yagmail的示例代码
2018/02/23 Python
Python如何发布程序的详细教程
2018/10/09 Python
对python:threading.Thread类的使用方法详解
2019/01/31 Python
解决Django layui {{}}冲突的问题
2019/08/29 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
Python3 无重复字符的最长子串的实现
2019/10/08 Python
python微信公众号开发简单流程实现
2020/03/09 Python
Python requests模块session代码实例
2020/04/14 Python
Python读取Excel数据并生成图表过程解析
2020/06/18 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
2020/08/28 Python
详解android与HTML混合开发总结
2018/06/06 HTML / CSS
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
STP协议的主要用途是什么?为什么要用STP
2012/12/20 面试题
公司合作协议范文
2014/10/01 职场文书
人事任命通知书
2015/04/21 职场文书
用电申请报告范文
2015/05/18 职场文书
机械生产实习心得体会
2016/01/22 职场文书
浅谈Python中对象是如何被调用的
2022/04/06 Python