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

本文主要讨论一下文件的三种可读可写模式的特色及互相之间的区别,以及可否实现修改文件的操做
因为前文已经讨论过编码的事情了,因此这里再也不研究编码,全部打开操做默认都是utf-8编码(Linux系统下)python

首先咱们看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的位置,而后再写入:code

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
    十步杀一个土匪里不留行

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

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

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

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+这种模式打开文件的那一刻,这个文件本来的内容就已经消失了。class

最后咱们看看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+能够实现修改的操做,可是结果每每和咱们预期的不太同样,固然,除非你知道要把确切的内容换成确切的新内容,不过感受这个应用价值不大吧?集合

相关文章
相关标签/搜索