python读写文件的文本模式_Python中文件的读写、写读和追加写读三种模式的特点...

本文主要讨论一下文件的三种可读可写模式的特点及互相之间的区别,以及能否实现修改文件的操作

由于前文已经讨论过编码的事情了,所以这里不再研究编码,所有打开操作默认都是utf-8编码(Linux系统下)

首先我们看r+(读写)

既然r+既能读又能写,那么能否实现在r+模式下进行文件的修改呢?答案是肯定的!,但是,有一点你需要注意,除非你知道在确切的位置修改确切的内容,否则往往不会得到你期望的结果。举个例子如下:

我们有这样一个文本“十步杀一人,千里不留行”

假设有这样一个需求,把“十步杀一人”改成“十步杀一个土匪”,初步设想是:用read(4)读取到汉字“一”,然后写入汉字“个土匪”:

with open('job', mode='r+') as f:

print('先读取四个字符:',f.read(4))

print('读取后的指针位置:',f.tell())

f.write('个土匪')

f.seek(0)

print(f.read())

输出为:

先读取四个字符: 十步杀一

读取后的指针位置: 12

十步杀一人,千里不留行个土匪

从结果可以看到,使用read(4)指针确实移动到了指定的位置,但是写入的时候却没有按照设想,而是跑到了文件的末尾。这个原因涉及到一个叫“CHUNK”的东西,俺滴老师没教,我也不好深说,等深入理解它后再和你们讲哈😅😅😅

那么我们只说解决办法,可以用seek()手动定位指针,让它处在12的位置,然后再写入:

with open('job', mode='r+') as f:

print('先读取四个字符:',f.read(4))

print('读取后的指针位置:',f.tell())

f.seek(f.tell())

f.write('个土匪')

f.seek(0)

print(f.read())

输出:

先读取四个字符: 十步杀一

读取后的指针位置: 12

十步杀一个土匪里不留行

从结果可以看出,它确实是把人字改成了“个土匪”,可是它却把后面的字给覆盖了,这完全不是我们想要的结果,那么为什么呢?

原因就是:当文件写入磁盘后,磁盘会分出一块空间(实际上应该叫多个存储元的集合,具体请参考我另外一篇文章),这块空间是固定的,当你定位指针修改已经存在的内容时,相邻的后面的内容并不会给你要写入的内容“让地方”,也就是说你可以对它进行覆盖操作,但是你不能让后面的内容挪地方(这么说直白不?应该能明白吧。), 因此,虽然我们想要修改的是人这个字,但是由于你写入了“个土匪”三个字,所以后面的内容被覆盖了,变成了“十步杀一个土匪里不留行”。

接下来我们看看w+(写读模式)

w+,也就是写读操作,仍然对文件libai2操作,需求还是上例的需求

with open('libai2','w+') as f:

content = f.read(25)#读取25个字符,这其中包括24个中文汉字或符号 和 一个换行符

print('读取操作后的指针位置:',f.tell())#指针处在0,那么意味着文件内容是空的

f.write('五')#然后我们写入中文汉字:“五”,期待能覆盖掉原来的“十”

print('写入操作后的指针位置:',f.tell())#结果发现指针在3字节的位置,也就是一个汉字五的后面

f.seek(0)

print(f.read())

读取操作后的指针位置: 0

写入操作后的指针位置: 3

我们可以看到整个文件的内容消失了,只有一个汉字“五”

这是因为w开头的模式会先进行判断,如果文件已存在则打开文件,并且清空文件内容。如果该文件不存在,则创建新文件。

所以当使用w+这种模式打开文件的那一刻,这个文件原本的内容就已经消失了。

最后我们看看a+(追加写读模式)

我们在后台从新创建了一个libai3文件,里面还是只包含那两句诗

with open('libai3','a+') as f:

print('初始指针位置',f.tell())

#初始指针位置是146,48个汉字或字符 加2个换行符,48*3+2=146

#由此可以看出,初始文件指针处在文件末尾位置

f.seek(73) #我们把指针调整到73字节的位置,也就是汉字“十”的前面

print('调整指针在73字节的位置:',f.tell())

f.write('五')#然后我们写入汉字“五”

f.seek(0) #调整指针到文件头部位置

print(f.read()) #输出文件看看发生了什么

初始指针位置 146

调整指针在73字节的位置: 73

赵客缦胡缨,吴钩霜雪明。银鞍照白马,飒沓如流星。

十步杀一人,千里不留行。事了拂衣去,深藏身与名。

我们发现汉字“五”还是被写在了文件末尾

总结

w+和a+无法完成文件的修改操作,r+可以实现修改的操作,但是结果往往和我们预期的不太一样,当然,除非你知道要把确切的内容换成确切的新内容,不过感觉这个应用价值不大吧?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html颜色叠加代码,html代码大全(基础使用代码)(颜色代码完整版)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼您在使用以下基础使用代码时请把{}换成<>&#xff01;&#xff01;&#xff01;)(这样这个命令才成立&#xff01;&#xff01;&#xff01;)基础使用代码&#xff1a;1)贴图&#xff1a;{img src"图片地址"}2)加入…

如何看懂源代码

如何看懂源代码--(分析源代码方法) 【转载】 由于今日计划着要看Struts 开源框架的源代码 昨天看了一个小时稍微有点头绪,可是这个速度本人表示非常不满意,先去找了下资料, 觉得不错... 摘自(繁体中文Traditional Chinese):http://www.ithome.com.tw/itadm/article.php?c477…

面试之 Python 进阶

前端相关 1.谈谈你对http协议的认识。 浏览器本质&#xff0c;socket客户端遵循Http协议   HTTP协议本质&#xff1a;通过\r\n分割的规范 请求响应之后断开链接 > 无状态、 短连接 具体&#xff1a;   Http协议是建立在tcp之上的&#xff0c;是一种规范&#xff0c;它…

Lync Server外部访问系列PART5:模拟公网DNS

因为要实现外部用户访问&#xff0c;所以我们必然需要在公网DNS中添加我们所需要的一些A记录&#xff0c;而这样的测试需要我们拥有一个公网的域名以及一个可发布、可访问的IP。如果没有的话就没办法这样测试&#xff0c;所以我们今天在物理局域网中搭建一台DNS服务器&#xff…

C语言运算符和表达式

参考链接&#xff1a;http://blog.csdn.net/qq_31059475/article/details/51195091 概述 C语言一共有34种运算符&#xff0c;10种运算类型&#xff1a;算术运算符&#xff08;、-、*、/、%&#xff09;、关系运算符&#xff08;>、>、、&#xff01;、<、<&#xf…

oracle对查询结果求和_Oracle 闪回技术详解

概述闪回技术是Oracle强大数据库备份恢复机制的一部分&#xff0c;在数据库发生逻辑错误的时候&#xff0c;闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成)。需要注意的是&#xff0c;闪回技术旨在快速恢复逻辑错误&#xff0c;对于物理损坏或是…

html整人js代码大全,Fool.js恶搞整人网页特效jQuery插件

Fool.js是一个 jQuery 插件&#xff0c;包含了几种页面特效&#xff0c;可以用来在愚人节的时候整人&#xff0c;来实现更多的更变态的愚人功能&#xff0c;当然你也可以使用这个插件完成更多好看的效果。支持的特效消失的滚动条莫名其妙播放的音乐随机消失的页面元素不间断的弹…

HDU - 5934

tarjan 视频讲解 /*** 题目链接&#xff1a;https://vjudge.net/problem/HDU-5934* 题意&#xff1a;给你n个炸弹&#xff0c;引爆每个炸弹会有一定的花费。每个炸弹给出坐标x&#xff0c;y&#xff0c;半径r&#xff0c;引爆花费&#xff1b;* 引爆一个炸弹会把范围内的炸…

Centos7-Lvs+Keepalived架构实验详解

Centos7-LvsKeepalived架构 LVSKeepalived 介绍 1 、 LVS LVS 是一个开源的软件&#xff0c;可以实现 LINUX 平台下的简单负载均衡。 LVS 是 Linux Virtual Server 的缩写&#xff0c;意思是 Linux 虚拟服务器。目前有三种 IP 负载均衡技术&#xff08; VS/NAT 、 VS/TUN 和 …

python调用matlab环境配置、非常详细!!!_[python][matlab]使用python调用matlab程序

问题引入 在做实验的时候&#xff0c;需要用到python和matlab工具来进行不同的处理&#xff0c;比如在run神经网络的时候&#xff0c;需要使用pytorch框架得到网络的各个参数&#xff0c;在得到参数后需要使用matlab进行聚类规划。之前的做法是用python脚本耦合其联系&#xff…

html里写js ajax吗,js、ajax、jquery的区别是什么?

js、ajax、jquery的区别1、JS是一门前端语言。2、Ajax是一门技术&#xff0c;它提供了异步更新的机制&#xff0c;使用客户端与服务器间交换数据而非整个页面文档&#xff0c;实现页面的局部更新。3、jQuery是一个框架&#xff0c;它对JS进行了封装&#xff0c;使其更方便使用。…

Flask 基础

Flask是一个基于Python开发并且依赖 jinja2 模板和 Werkzeug WSGI 服务的一个微型框架&#xff0c;对于Werkzeug本质是Socket服务端&#xff0c;其用于接收http请求并对请求进行预处理&#xff0c;然后触发Flask框架&#xff0c;开发人员基于Flask框架提供的功能对请求进行相应…

IIS 部署asp.net Core程序注意事项

Install the .NET Core Windows Server Hosting bundleInstall the.NET Core Runtime修改应用程序池的.net framework版本为无托管代码转载于:https://www.cnblogs.com/Qos8/p/7616036.html

泰安第一中学2021年高考成绩查询,等级考第一天结束 泰安部分考生已完成2021年高考...

6 月 9 日&#xff0c;山东新高考进入第三天&#xff0c;也是学业水平等级考试的第一天&#xff0c;物理、思想政治、化学三门选考科目的考试已全部完成。由于选考科目不同&#xff0c;考生结束高考的进程也不同&#xff0c;9 日下午&#xff0c;选考物理、思想政治、化学的考生…

基于FFMPEG 的跨平台视频编解码研究

第33卷 第11期2011年11月武 汉 理 工 大 学 学 报JOURNALOF WUHANUNIVERSITYOFTECHNOLOGY Vol.33 No.11췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍Nov.2011DOI:10.3963/j.issn.1671-4431.2011.11.029基于FFMPEG 的…

python逻辑型数据也叫什么_Python入门 | 运算符和数据类型

自用总结。 零散知识 1.Python的计算方法&#xff1a;运算符、函数、方法 1) 方法与函数的区别&#xff1a; 方法与特定类型的对象有关&#xff0c;是属于某个对象的函数&#xff0c;对象始终是该方法的第一个参数。e.g. islower()方法是检查字符串中字符是否为小写形式的方法&…

Flask 第三方组件之 WTForms

简介 WTForms是一个支持多个web框架的form组件&#xff0c;主要用于对用户请求数据进行验证。 安装&#xff1a; pip3 install wtforms 用户登录注册示例 1. 用户登录 当用户登录时候&#xff0c;需要对用户提交的用户名和密码进行多种格式校验。如&#xff1a; 用户不能为…

机器学习原理与算法(六) 支持向量机

版权声明&#xff1a;本系列文章为博主原创文章&#xff0c;转载请注明出处&#xff01;谢谢&#xff01; 本章索引&#xff1a; 从第3章的Logistic回归算法开始&#xff0c;我们一直在讨论分类问题。在各种不同的分类算法中&#xff0c;...&#xff0c;我们一直在讨论如何分类…

读《程序员的SQL金典》[2]--函数

一、数学函数 1.RAND SELECT RAND () ---0.302870228294199取0-1之间的随机小数。 2.小数取整 CEILINT(data)舍掉小数部分并向上取整。FLOOR(data)舍掉小数部分并向下取整。SELECT TOP 3 FWeight, CEILING(FWeight ),FLOOR( FWeight) FROM T_PersonRound(m,d)&#xff1a;四舍…

html div模块前留空白,html – 3个DIV彼此相邻,中间填充空白

您好我想问你如何将3 DIV放在一起,而中间一个填补第一和第三DIV之间的空白.我想在第一个NAD第三个DIV中有动态按钮,我需要中间DIV来填充第一和第三个DIV之间的空间.我会破坏纯CSS / HTML(没有JavaScript)这是我的尝试&#xff1a;http://jsfiddle.net/4smx3627/#wrapper{height…