Python文件读写w+和r+区别解析


Posted in Python onMarch 26, 2020

其实r 是只读,只能读不能写,这是很明确的,但是r+是可读写,变成r+后还没太明白到底加了什么,还是照样写不了,有没有这样的体验呢,如下代码,只读时

f = open("test.txt", 'r', encoding="utf-8") # 文件句柄
f.write("we are heros\n")

data = f.read()
print(data, type(data))
f.close()

这样的话报错是明显的:io.UnsupportedOperation: not writable,不可写应都能理解,但是变成r+呢

f = open("test.txt", 'r+', encoding="utf-8") # 文件句柄
f.write("we are heros\n")

data = f.read()
print(data, type(data))
f.close()

你试过会发现,什么也没打印出来,同时注意!!!也没有报错。到底是什么意思呢?

其实是由于读写机制的问题,当一个文件被读或者写一次后,文件中类指针的东西指向的是整个文件的末尾,再次读时从末尾开始读的话肯定是什么都

读不到了,所以会出现这样的问题,和连续f.read()两次的话,第二次什么都不会读到的原因是相同的。那如何写完了接着读呢,见代码

f = open("test.txt", 'r+', encoding="utf-8") # 文件句柄
 f.write("we are heros\n")
 f.seek(0)
 data = f.read()
 print(data, type(data))
 f.close()

加上f.seek(0)使得类指针的东西回到文件的开头然后从头开始读即可。配合f.tell()使用,英文及字符返回的是那个类指针的位置(也就是字符个数),但是中文的话是字符 个数*3,具体原因还得请大侠给讲讲。

r+与w+啥区别呢,不能简单的理解为读写都可,细节之处略有不同!

  • r+:先读后写的话是在原有文本后添加, 因为读完后类指针已经在最末尾了,如果是先写后读的话,是从头开始覆盖式写(如只修改了前面的字符,后面字符是不会被删掉的),类指针停留在写完的末尾,不是文档末尾,可以读出未被覆盖写的部分;
  • w+:为先写后读,先写完后使用f.seek(0)回到初始位置然后开始读,如果先读的话是读不出任何东西的,因为w+也是纯粹的覆盖写,在未使用写操作前文档是完全空白的,无论之前该文件里有什么。so ,只能先写后读。
  • r和w的区别,r必须已经存在这个文件了而 w时文件可以有也可以没有,if有被覆盖,else没有则创建一个(慎用),r+的写也是覆盖的!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python利用elaphe制作二维条形码实现代码
May 25 Python
跟老齐学Python之不要红头文件(2)
Sep 28 Python
Python多线程编程(二):启动线程的两种方法
Apr 05 Python
python的文件操作方法汇总
Nov 10 Python
python一行sql太长折成多行并且有多个参数的方法
Jul 19 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
Jan 29 Python
Python Django Cookie 简单用法解析
Aug 13 Python
基于plt.title无法显示中文的快速解决
May 16 Python
Python操作Excel把数据分给sheet
May 20 Python
Python基于unittest实现测试用例执行
Nov 25 Python
selenium自动化测试入门实战
Dec 21 Python
python之基数排序的实现
Jul 26 Python
Python装饰器实现方法及应用场景详解
Mar 26 #Python
pycharm中导入模块错误时提示Try to run this command from the system terminal
Mar 26 #Python
Python多进程编程常用方法解析
Mar 26 #Python
简单了解python调用其他脚本方法实例
Mar 26 #Python
Python tornado上传文件的功能
Mar 26 #Python
Python Tornado批量上传图片并显示功能
Mar 26 #Python
python列表删除和多重循环退出原理详解
Mar 26 #Python
You might like
php学习 字符串课件
2008/06/15 PHP
php in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
thinkPHP的表达式查询用法详解
2016/09/14 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
JavaScript中的原型链prototype介绍
2014/12/30 Javascript
Jquery 实现弹出层插件
2015/01/28 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
jQuery增加、删除及修改select option的方法
2016/08/19 Javascript
实例解析jQuery工具函数
2016/12/01 Javascript
利用jquery实现下拉框的禁用与启用
2016/12/07 Javascript
jQuery使用ajax方法解析返回的json数据功能示例
2017/01/10 Javascript
jquery dataTable 获取某行数据
2017/05/05 jQuery
vue服务端渲染的实例代码
2017/08/28 Javascript
Vue from-validate 表单验证的示例代码
2017/09/26 Javascript
bootstrap实现二级下拉菜单效果
2017/11/23 Javascript
BootStrap modal实现拖拽功能
2018/12/01 Javascript
JS实现的冒泡排序,快速排序,插入排序算法示例
2019/03/02 Javascript
Vue 实现分页与输入框关键字筛选功能
2020/01/02 Javascript
黑科技 Python脚本帮你找出微信上删除你好友的人
2016/01/07 Python
Python上下文管理器和with块详解
2017/09/09 Python
python机器学习理论与实战(四)逻辑回归
2018/01/19 Python
Python3中在Anaconda环境下安装basemap包
2018/10/21 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
结合OpenCV与TensorFlow进行人脸识别的实现
2019/10/10 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
阿迪达斯中国官网:Adidas中国
2020/12/14 全球购物
会议主持词
2014/03/17 职场文书
党员承诺书内容
2014/03/26 职场文书
产品包装策划方案
2014/05/18 职场文书
2014年“世界无车日”活动方案
2014/09/21 职场文书
2014年档案管理员工作总结
2014/12/01 职场文书
五年级小学生评语
2014/12/26 职场文书
Java框架入门之简单介绍SpringBoot框架
2021/06/18 Java/Android