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 相关文章推荐
Django1.3添加app提示模块不存在的解决方法
Aug 26 Python
Python中设置变量作为默认值时容易遇到的错误
Apr 03 Python
Python单元测试框架unittest使用方法讲解
Apr 13 Python
Python中多线程的创建及基本调用方法
Jul 08 Python
不可错过的十本Python好书
Jul 06 Python
详解python里使用正则表达式的分组命名方式
Oct 24 Python
python 构造三维全零数组的方法
Nov 12 Python
Python中一些深不见底的“坑”
Jun 12 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
Jun 21 Python
python实现音乐播放和下载小程序功能
Apr 26 Python
Python使用sys.exc_info()方法获取异常信息
Jul 23 Python
Python使用grequests并发发送请求的示例
Nov 05 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
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
PHP 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
js wmp操作代码小结(音乐连播功能)
2008/11/08 Javascript
JavaScript Accessor实现说明
2010/12/06 Javascript
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
JavaScript限定复选框的选择个数示例代码
2013/08/25 Javascript
node.js中的fs.openSync方法使用说明
2014/12/17 Javascript
JS实现的页面自定义滚动条效果
2015/10/26 Javascript
深入浅析NodeJs并发异步的回调处理
2015/12/21 NodeJs
javascript多物体运动实现方法分析
2016/01/08 Javascript
js中获取键盘事件的简单实现方法
2016/10/10 Javascript
JS验证input输入框(字母,数字,符号,中文)
2017/03/23 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
2017/08/04 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
2017/09/30 Javascript
javascript设计模式 ? 装饰模式原理与应用实例分析
2020/04/14 Javascript
详细介绍Ruby中的正则表达式
2015/04/10 Python
Windows下实现Python2和Python3两个版共存的方法
2015/06/12 Python
python3批量删除豆瓣分组下的好友的实现代码
2016/06/07 Python
pygame加载中文名mp3文件出现error
2017/03/31 Python
Python拆分大型CSV文件代码实例
2019/10/07 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
利用CSS3的线性渐变linear-gradient制作边框的示例
2016/06/02 HTML / CSS
HTML5 canvas基本绘图之绘制矩形
2016/06/27 HTML / CSS
详解HTML5 Canvas绘制不规则图形时的非零环绕原则
2016/03/21 HTML / CSS
医院后勤自我鉴定
2013/10/13 职场文书
少年闰土教学反思
2014/02/22 职场文书
会计自荐信范文
2014/03/09 职场文书
应届生自荐信
2014/06/30 职场文书
高中校园广播稿3篇
2014/09/29 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
django上传文件的三种方式
2021/04/29 Python