晓晓---python文件的读写模式的理解

1. python读取文件模式的自我理解:

'r' open for reading (default)----只读模式打开文件,不能写;
'w' open for writing, truncating the file first ----只写模式打开文件,不能读,并且每次写的时候都会清空之前的部分;
'x' create a new file and open it for writing----只写模式,文件不存在则会创建文件,如果文件已经存在则会报错;
'a' open for writing, appending to the end of the file if it exists---只写模式打开文件,并且是追加,就是每次写入
都会在原来文件的基础上增加----追加追加追加;该模式下,f.seek()方法对写不生效,即使移动至文档开头,再写入时还是会追加在末尾;
'b'       binary mode ----读写的时候是二进制不是文本模式,二进制就是读写的是字节码,不需要编码格式之类的,必须和上边的 r w x a 组合使用
't' text mode (default) -----文本读写模式,这个主要是和二进制的模式相对应的,默认情况下都是文本模式,与二进制相对,可以不写
'+' open a disk file for updating (reading and writing) ----打开文件需要同时读写时,但是该模式必须和上边的 r w x a 组合使用

'U' universal newline mode (deprecated)----已经弃用了,别看了

2. 这些模式到底哪些可以组合在一起
看完了之后呢,这些模式根据功能可以划分为三组(r w x a) , ( b t), (+ ),其中(r w x a)---主模式,就是你给模式赋值时这四种里边至少需要包含一种,
如果你需要二进制r,w,
x a ---默认为文本模式读写,二进制模式读写,------rb,wb,ab,xb, 如果需要在这些主模式的情况下,加上读或者写的功能,可以改为 r+,w+,x+,a+
r,rb,rb+,rt,rt+
w,wb,wt=w+,wb+,wt+
...
其他模式组合类似


3. 各种模式组合在一起之后到底表示什么意思
r+----该模式下可读可写,此时如果不移动文件指针,写入的时候是从文件的开头写入的,写入时是覆盖了之前的内容的,比如你原本文件里边的内容是:123杨洋,如果你写入你好帅,
那这时候文件的内容变为:你好帅杨洋;如果你通过f.seek(0,2)移动文件指正至文件末尾,再写入的时候,则是追加;

w+---写入文件,每次都是把之前的文件内容全部清空然后写入最新的;

a+---可读可写,该模式下写入的时候始终是追加在末尾,通过f.seek()方法移动指针再写入也是会追加在末尾
4. 如我我想在文件的开头插入内容,怎么做?
在文件的开头插入内容,1)需要先把之前的文件的内容给读出来 2)然后把文件清空 3)然后写入你要插入的内容 4)然后再把之前的内容给写入;
下边是列出的各种错误的实现模式供你对照下看下踩坑踩到哪里了

很多代码看似正确,但是其实都是错的。一起来看下这些代码


1、看似正确的错误代码1


with open(path, "r+") as f:


f.seek(0)


f.write(data)


确实是从头写了,而且有些原有数据确实在,但是数据有问题。。。。


因为”r+”方式写文件操作没有插入的语义,只有写文件的含义,原来位置如果有数据,不会后移的,是覆盖掉了。。。。所以,你可能会看到一些老的数据。

不仔细辨别可能就天真地以为成功了。。。


2、看似正确的错误代码2


with open(path, "w+") as f:


old = f.read()


f.seek(0)


f.write(data)


f.write(old)


你读取到的数据永远为空。。。。


因为”w+”的含义就是截取长度为0然后写入文件。


3、看似正确的错误代码3


with open(path, "a+") as f:


old = f.read()


#f.truncate(0) #取消掉注释成正确代码


f.seek(0)


f.write(data)


写入的数据永远出现在文件末尾。。。。。


要打破魔咒的话要先将文件截断成0字节。。。。


snack:想要”a+”的效果变”r+”,在读之前先seek(0),在写之前要truncate一下,确保要写入的位置是文件的末尾。


正确的代码


with open(path, "r+") as f:


old = f.read()


f.seek(0)


f.write(data)


f.write(old)


原理思路:读出原有文件内容,移动索引到开始,写入新的数据,然后写入旧的数据。
————————————————
版权声明:本文为CSDN博主「weixin_39701861」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39701861/article/details/111458704----示例错误代码来源

 



posted on 2022-09-06 11:45  ClareBaby01  阅读(279)  评论(0编辑  收藏  举报