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

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

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

首先我们看r+(读写)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

总结

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181003G01FSX00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券