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

由于前文已经讨论过编码的事情了,所以这里不再研究编码,所有打开操作默认都是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+可以实现修改的操作,但是结果往往和我们预期的不太一样,当然,除非你知道要把确切的内容换成确切的新内容,不过感觉这个应用价值不大吧?

python中文件读写位置的作用-Python中文件的读写、写读和追加写读三种模式的特点...相关推荐

  1. python中文件读写位置的作用-Python中文件的读写

    1.Python中的open()函数 Python中提供了open()内置函数,在默认情况下可以对文件对象进行操作. open()函数将文件名作为唯一必不可少的参数,并返回一个文件对象.如果只指定一个 ...

  2. python中文件读写位置的作用-python配置文件的读写

    1. 配置文件configuration file python中的配置文件有.conf..ini..cfg..txt等多种,其中.ini最常见 .ini文件是Initialization File的 ...

  3. Python中文件的读写、写读和追加写读三种模式的特点

    本文主要讨论一下文件的三种可读可写模式的特点及互相之间的区别,以及能否实现修改文件的操作 由于前文已经讨论过编码的事情了,所以这里不再研究编码,所有打开操作默认都是utf-8编码(Linux系统下) ...

  4. python语言特点强制可读-Python中文件的读写、写读和追加写读三种模式的特点

    本文主要讨论一下文件的三种可读可写模式的特点及互相之间的区别,以及能否实现修改文件的操作 由于前文已经讨论过编码的事情了,所以这里不再研究编码,所有打开操作默认都是utf-8编码(Linux系统下) ...

  5. python语言中print函数的作用_python中如何使用print函数

    Python中print语句 1.逗号分隔符 在Python中print语句可根据sys.stdout中包含的文件生成输出,它接受一个逗号分隔的对象表,如下实例:x = 1 y = 2 z = 3 p ...

  6. 第六章apache目录文件的位置及作用

    版本V1.0 时间2012-10-04 版权GPL 作者itnihao 邮箱 itnihao@qq.com 博客 http://itnihao.blog.51cto.com 如需重新发行,请注明以上信 ...

  7. 服务器c盘logs文件夹,Win10系统Logs文件夹有什么作用?Logs文件夹可以删除吗?

    Windows系统中一般都会有一个Logs文件夹,它能够记载系统运行的一些记录,我们可以使用记事本将它打开.最近,有Win10系统的用户,在查看电脑的时候发现有一个Logs文件夹,不知道Logs文件夹 ...

  8. [ROS2] map_server加载地图文件的三种模式

    map的数据类型 map话题的类型是nav_msgs::msg::OccupancyGrid.使用下面的命令可以查询该类型的数据结构. ros2 interface show nav_msgs/msg ...

  9. android中MVC,MVP和MVVM三种模式详解析

    我们都知道,Android本身就采用了MVC模式,model层数据源层我们就不说了,至于view层即通过xml来体现,而 controller层的角色一般是由activity来担当的.虽然我们项目用到 ...

最新文章

  1. Ubuntu10.04下PDF中文无法显示或显示乱码的解决方法
  2. sql server 用户'sa'登录失败(错误18456)
  3. ubuntu上开启SSH服务
  4. springboot打包不同环境配置与shell脚本部署
  5. 30分钟回顾AI数学基础知识(一)
  6. python requests请求失败重试_Python Requests.post()请求失败时的retry设置
  7. MySQL二级比office二级_如何快速拿到计算机office二级
  8. xp系统debugger用户_xp系统BIOS恢复出厂设置开机需按F1的具体步骤--win10专业版
  9. JQuery上传插件Uploadify详解及其中文按钮解决方案
  10. 空格在Html中的表示方法(nbsp含义)
  11. 转:初学shell脚本--shell语法使用
  12. java初级开发面试题
  13. Wget 下载 ILSVRC12 数据集
  14. POI复制Excel模板并填充数据
  15. 关于win10微软商店打不开的99%解决办法
  16. iOS 音乐播放器demo讲解
  17. 玩转Jetson AGX Orin官方套件
  18. 开关电源MOS管选型500V、600V、650V参数
  19. Mathematica求解不定积分与定积分
  20. xmanager5 + xshell linux 远程

热门文章

  1. lisp 线性标注自动避让_自动化数据增强:实践、理论和新方向
  2. java打字母小游戏总结与收获,java:打字母小游戏demo
  3. (传送门)android studio 一直卡在Gradle:Build Running的解决办法
  4. 神经网络中归一化的重要作用
  5. Spark MLlib介绍
  6. 代码中的各种时间格式
  7. Node初学(一)require方法
  8. java 32个Java面试必考点
  9. ZooKeeper与Eureka对比
  10. VS2015 解决方案 或者项目 卡 正在加载 的解决办法