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 相关文章推荐
Flask SQLAlchemy一对一,一对多的使用方法实践
Feb 10 Python
零基础写python爬虫之打包生成exe文件
Nov 06 Python
python创建一个最简单http webserver服务器的方法
May 08 Python
Python查询阿里巴巴关键字排名的方法
Jul 08 Python
python爬虫基本知识
Mar 05 Python
Python简单计算文件MD5值的方法示例
Apr 11 Python
Django代码性能优化与Pycharm Profile使用详解
Aug 26 Python
解决django同步数据库的时候app models表没有成功创建的问题
Aug 09 Python
python实现机器人卡牌
Oct 06 Python
python删除某个目录文件夹的方法
May 26 Python
用python写一个带有gui界面的密码生成器
Nov 06 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
Jan 12 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
文章推荐系统(三)
2006/10/09 PHP
第五节--克隆
2006/11/16 PHP
php 仿Comsenz安装效果代码打包提供下载
2010/05/09 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
简单概括PHP的字符串中单引号与双引号的区别
2016/05/07 PHP
自制PHP框架之路由与控制器
2017/05/07 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
php微信开发之关注事件
2018/06/14 PHP
JS模拟面向对象全解(二、类型与赋值)
2011/07/13 Javascript
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
JQuery实现可直接编辑的表格
2015/04/16 Javascript
jQuery UI插件实现百度提词器效果
2016/11/21 Javascript
简单实现AngularJS轮播图效果
2020/04/10 Javascript
微信小程序 商城开发(ecshop )简单实例
2017/04/07 Javascript
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
iphone刘海屏页面适配方法
2019/05/07 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
Angular利用HTTP POST下载流文件的步骤记录
2020/07/26 Javascript
Python中使用asyncio 封装文件读写
2016/09/11 Python
Python面向对象特殊成员
2017/04/24 Python
python3实现抓取网页资源的 N 种方法
2017/05/02 Python
简单谈谈python中的lambda表达式
2018/01/19 Python
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
详解python 3.6 安装json 模块(simplejson)
2019/04/02 Python
python框架flask表单实现详解
2019/11/04 Python
python实现名片管理器的示例代码
2019/12/17 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
Keras 实现加载预训练模型并冻结网络的层
2020/06/15 Python
使用Keras构造简单的CNN网络实例
2020/06/29 Python
Space NK美国站:英国高端美妆护肤商城
2017/05/22 全球购物
施华洛世奇中国官网:SWAROVSKI中国
2020/06/16 全球购物
Linux上比较文件的命令都有哪些
2013/09/28 面试题
历史系自荐信范文
2013/12/24 职场文书
幼儿园体操比赛口号
2015/12/25 职场文书
MySQL数据库简介与基本操作
2022/05/30 MySQL
js前端图片加载异常兜底方案
2022/06/21 Javascript