晓晓---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----示例错误代码来源
晓晓---python文件的读写模式的理解的更多相关文章
- python文件的读写的模式
<1>打开文件 在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件 open(文件名,访问模式) 示例如下: f = open('test.txt', 'w' ...
- Python文件的读写操作
Python文件的使用 要点:Python能够以文本和二进制两种形式处理文件. 1.文件的打开模式,如表1: 注意:使用open()函数打开文件,文件使用结束后耀使用close()方法关闭,释放文件 ...
- python文件的读写总结
读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘, ...
- python—— 文件的打开模式和文件对象方法 & os、os.path 模块中关于文件、目录常用的函数使用方法
引用自“鱼c工作室” 文件的打开模式和文件对象方法 : https://fishc.com.cn/forum.php?mod=viewthread&tid=45279&ext ...
- python文件的读写权限以及相关应用read、write和文件指针
f=open('ceshi.txt','a',encoding='utf-8')r=open('ceshi.txt','r',encoding='utf-8')上面的2种写法可以用with来写:wit ...
- [ Python ] 文件的读写操作
1. 文件读写操作 读写文件是最常见的 IO 操作, Python 内置了读写文件的函数.在磁盘上读写文件的功能是由操作系统提供的,所以读写文件是请求操作系统打开一个文件对象(通常称为文件描述符),然 ...
- Python文件的读写
一.写数据 f = open("hello.txt", "w") f.write("hello world python!") f.clos ...
- 【8】python文件的读写方法
(1).读文件的步骤: (1)打开文件 open(path,flag,encoding,[errors]) path:打开路径 flag:打开方式 r(只读) rb(二进制格式) r+(可以读写) w ...
- python文件的读写追加等操作
# encoding:utf-8 # 文件读取操作 fp=open("E:\\file.txt","r",encoding="utf-8" ...
- 第9.9节 Python文件随机读写定位操作方法seek
类似于C语言,Python也提供了文件位置定位的操作方法seek. 一. 语法 seek(offset, whence=SEEK_SET) 语法释义: 1)offset :将文件当前操作位置移动偏移量 ...
随机推荐
- CCRD_TOC_2007_EULAR专辑_2
中信国健临床通讯 EULAR 2007专辑II 目录 类风湿关节炎 1 Etanercept联合MTX治疗RA导致炎症与骨破坏进展之间的失关联也见于单关节水平:来自TEMPO的研究数据 Landewe ...
- Mars3D与第三方集成
1. 引言 Mars3D是基于Cesium的Web端的三维GIS库,对Cesium做了进一步封装和扩展 Mars3D官网:Mars3D三维可视化平台 | 火星科技 Mars3D开发手册:开发教程 - ...
- CF1137F Matches Are Not a Child's Play 题解
以最后被删去的点为根,这样子不会存在从父亲然后删掉某个点,儿子的删除顺序一定比父亲前. 记每个点子树中的最大值为 \(f_x\),那么一个点的排名,首先就需要加上 \(<f_x\) 的所有值,记 ...
- 前端回血day24 flex子项伤的CSS属性
取值 含义 order 可以通过设置order改变某一个flex子项的排序位置.所有flex子项的默认order属性值是0 flex-grow 属性中的grow是扩展的意思,扩展的就是flex子项所占 ...
- 【剑指Offer】【树】二叉树中和为某一值的路径
题目:输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大的数 ...
- 档案系统区块链集成 leveldb.net集成
leveldb.net工作原理:leveldb为键值对数据库,具有增加,删除,查询功能,利用加密链式结构存储和查询数据. 区块(block):在区块链技术中,数据以电子记录的形式被永久储存下来,存放这 ...
- 2022-06-01内部群每日三题-清辉PMP
1.采购部门要求项目经理提供一个项目的招标文件.这些文件中应该包含哪些内容? A.变更请求 B.选择的卖方 C.质量测量指标 D.建议邀请书 2.作为一个大型组织中关键项目的组成部分,阀门制造业务被外 ...
- java springboot+rabbitmq+websocket 订阅展示
记录工作 需要的依赖 <!--fastjson坐标--> <dependency> <groupId>com.alibaba</groupId> < ...
- redis底层数据结构之压缩列表(ziplist)
压缩列表(ziplist) 压缩列表(ziplist)是redis 为了节约内存而开发的,由连续内存块组成的顺序型数据结构,适用于长度较小的值 存取的效率高,内存占用小,但由于内存是连续的,在修改的时 ...
- 浅谈Java线程池的概念、创建与执行
转': 浅谈Java线程池的概念.创建与执行 如果使用 newCachedThreadPool 线程池的实例: ExecutorService executor = Executors.newCa ...