Python文件读写 - 文件r+ a+ open读写实际表现[示例]
先说结论:
文件r+ open:
1. write()不能实现插入写,它总是覆盖写或附加写;
2. 如果文件一打开即write(),则从开头覆盖写;
3. 如果文件一打开,用f.seek()指定文件指针位置,然后执行f.write()则从指针位置写(覆盖写);
4. 如文件打开后先执行了readline(), 然后再执行write(),实现的是附加写
文件a+ open:
1. 文件打开后起始指针为文件末尾,readline()将读不到数据
2. write()始终是附加写 ,即使将文件指针指到中间再执行write()仍然附加写
共性:
1. write()是先写内存,f.close()时才将物理写入
2. f.tell()函数把'\n'换行符当成一个字符而不是两个,计算偏移量时会是1不会是2
测试过程:
文件companies.txt内容:
tencent
alibaba
baidu
r+模式:
# python version: 3.6.3
>>> f = open(r'python/file/companies.txt','r+')
>>> f.tell() #查看文件指针值
0
>>> f.readline() #读一行
'google\n'
>>> f.tell() #再次查看文件指针值
7
>>> f.write('xxx') #在文件指针位置为7时,尝试写入字符串'xxx'
3
>>> f.tell() #再次查看文件指针值,已经变为文件末尾了
31
>>> f.readline() #再读一行,看下是读到eof还是接着读第二行
'tencent\n'
>>> f.readlines() #实际上还是读第二行,并未从文件指针处开始读,而且第二行中也没有之前写入的'xxx',那么'xxx'写到哪里去了呢?把剩下的行全部读出来
['alibaba\n', 'baidu']
>>> f.seek(0,0) #剩余的行也没有发现'xxx'。难道是附加在第一行后面吗?通过seek(0,0)把文件指针指到开头
0
>>> f.readlines() #读整个文件
['google\n', 'tencent\n', 'alibaba\n', 'baiduxxx']
>>> #最初写入的'xxx'其实是被附加到了文件末尾。说明用r+打开文件后,先用f.readline()读行,再f.write('xxx')的方式不能将字符串写入文件指针所在位置;而且,在write后是先写内存,并没有真的写进文件中,这时候readlines()是读不出来的,当执行f.seek()后readlines()才能读出。读出也不代表commit,真正的物理写入是在执行f.close()才发生的
>>> f.seek(0,0) #将文件指针置回开头
0
>>> f.write('bbb') #文件指针在开头的初始状态下使用write()方法写入字符串
3
>>> f.tell() #查看文件指针位置,经过write()处理后,指针是否又到末尾了呢?
3
>>> f.seek(0,0) #发现这次write()之后,指针并没有指到末尾,而是在文件开头.那么将指针指回0,后续再读整个文件,看写入的效果
0
>>> f.readlines()
['bbbgle\n', 'tencent\n', 'alibaba\n', 'baiduxxx']
>>> # 'bbb'写到了文件开头,且是覆盖写,而不是插入。
>>> import os
>>> print(os.SEEK_SET,os.SEEK_CUR,os.SEEK_END) #文件的起始位置,当前位置,结束位置常量
0 1 2
>>> f.seek(5,os.SEEK_SET) #将文件指针直接指到5
5
>>> f.tell()
5
>>> f.write('ttt') #再试一次,看看在没有执行readline情况下,调整指针位置后再write()的效果
3
>>> f.tell()
8
>>> f.seek(0,0)
0
>>> f.readlines()
['bbbgltttencent\n', 'alibaba\n', 'baiduxxx']
>>> #'ttt'竟然是从第5位开始写的!说明write()也可以在文件中间实现覆盖写,而不仅仅是在开头覆盖写或文件末尾附加写,但是前提是打开文件后不能readline,而要直接设置指针位置后调用write()
>>> #总结:r+模式下,write()不能实现插入写,它总是覆盖写或附加写。如果文件一打开即write(),则从开头覆盖写;如文件打开后执行了readline(),然后再调用write(),实现的是附加写
a+模式:
>>> f = open(r'python/file/companies.txt','a+') # a+打开
>>> f.tell() #初始指针位置
28
>>> #初始指针已经指向末尾
>>> f.readline() #读一行, eof,读不到数据
''
>>> f.write('aaa') #写数据
3
>>> f.seek(0,0) #指针重置
0
>>> f.readlines() #读所有行
['google\n', 'tencent\n', 'alibaba\n', 'baiduaaa']
>>> # 'aaa'被附加到末尾了。这点和r+打开文件不同,r+打开文件后执行write()是从开头覆盖写
>>> f.seek(5,0) #文件指针从文件起始位置正向偏移5
5
>>> f.tell()
5
>>> f.write('bbb') #再试试写,看是从位置5开始写还是从末尾附加
3
>>> f.seek(0,0) #重置指针
0
>>> f.readlines() #读所有行
['google\n', 'tencent\n', 'alibaba\n', 'baiduaaabbb']
>>> #'bbb'附加在末尾,说明即使指定了文件指针位置,a+模式下也不会从文件中部写入,始终附加写入
Python文件读写 - 文件r+ a+ open读写实际表现[示例]的更多相关文章
- Python文件读写之r+/w+/a+
读模式 r 打开不存在的文件会报错.不能写:如不指定模式则默认是r 写模式 w 打开不存在的文件会,会新建一个文件:打开存在的文件会先清空后覆盖原有文件:不能读 追加模式 a 打开不存在的文件会,会新 ...
- python文件读写模式 --- r,w,a,r+,w+,a+,rb,wb
要了解文件读写模式,需要了解几种模式的区别,以及对应指针 r : 读取文件,若文件不存在则会报错 w: 写入文件,若文件不存在则会先创建再写入,会覆盖原文件 a : 写入文件,若文件不存在则会先创建再 ...
- Python文件的四种读写方式——r a w r+
# 文件的基本操作,但是一般不这么使用,因为经常会忘记关闭 password=open("abc.txt",mode="r",encoding="UT ...
- 一句python,一句R︱模块导入与查看、数据读写出入、数据查看函数、数据类型、遍历文件
先学了R,最近刚刚上手python,所以想着将python和R结合起来互相对比来更好理解python.最好就是一句python,对应写一句R. pandas中有类似R中的read.table的功能,而 ...
- python 读写文件中 w与wt ; r与rt 的区别
w,r,wt,rt都是python里面文件操作的模式.w是写模式,r是读模式.t是windows平台特有的所谓text mode(文本模式),区别在于会自动识别windows平台的换行符.类Unix平 ...
- Python 读写文件中w与wt, r与rt的区别
w和wt是一们的,r和rt是一样的,t是默认参数,可以省略的,help(open)就能看到open的参数的详细说明. w,r,wt,rt都是python里面文件操作的模式.w是写模式,r是读模式.t是 ...
- Python读写文件
Python读写文件1.open使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('t ...
- python基础之文件读写
python基础之文件读写 本节内容 os模块中文件以及目录的一些方法 文件的操作 目录的操作 1.os模块中文件以及目录的一些方法 python操作文件以及目录可以使用os模块的一些方法如下: 得到 ...
- python 读写文件和设置文件的字符编码
一. python打开文件代码如下: f = open("d:\test.txt", "w") 说明:第一个参数是文件名称,包括路径:第二个参数是打开的模式mo ...
随机推荐
- Linux驱动调试-根据oops的栈信息,确定函数调用过程
上章链接入口: http://www.cnblogs.com/lifexy/p/8006748.html 在上章里,我们分析了oops的PC值在哪个函数出错的,那如何通过栈信息来查看出错函数的整个调用 ...
- 应用教程之帕克西AR虚拟试妆3D动态美妆
帕克西技术团队通过对美妆行业深度调研,凭借自主研发的人脸识别与面部追踪等技术,打造的超现实AR虚拟试妆应用已成功上线,内置万千妆容,包含口红.眉毛.睫毛等,一点即可试妆,就像照镜子一样简单. 那么,帕 ...
- 一些内存模型、并发、netty知识点的记录
happens-before:描述内存可见性as-if-serial:无论怎么重排序,程序的运行结果不会改变 ReentrantLock依赖了队列同步器AQS,其实现方式是volatile变量的读写操 ...
- Java数据结构和算法(七)——链表
前面博客我们在讲解数组中,知道数组作为数据存储结构有一定的缺陷.在无序数组中,搜索性能差,在有序数组中,插入效率又很低,而且这两种数组的删除效率都很低,并且数组在创建后,其大小是固定了,设置的过大会造 ...
- Yii2如何添加sql日志记录的配置信息
在使用Yii2框架的时候,常常会出现没有sql日志记录的问题.在代码里一句一句的打印sql语句也不现实.所以就要用文件记录起来. 在 config/web.php 里面的 log配置中增加如下配置 [ ...
- 如何简单愉快的上手PipelineDB
pipelineDB source:https://github.com/pipelinedb/pipelinedb 安装PipelineDB ./configure CFLAGS="-g ...
- GDAL编译
使用cmd命令行编译 1.首先在“开始菜单\所有程序\Microsoft Visual Studio 2008\Visual Studio Tools\ Visual Studio 2008命令提示” ...
- 我的第一个python web开发框架(18)——前台页面与接口整合
由于我们前后台系统没有分开,所以前台页面调用接口时,可以直接使用后台管理系统已经完成的接口,不过后台管理系统接口的访问加上了登录验证,所以需要将前台要用到的接口进行处理,让它们设置到白名单当中 我们打 ...
- cocos2d-x 托付模式的巧妙运用——附源代码(一)
先来说一下托付模式是什么.以下的内容摘要自维基百科: 托付模式是软件设计模式中的一项基本技巧.在托付模式中,有两个对象參与处理同一个请求.接受请求的对象将请求托付给还有一个对象来处理.托付模式是一项基 ...
- C(8)
C语言位运算与文件 本章引言: 在不知不觉中我们的C高速入门系列已经慢慢地接近尾声了,而在这一节中,我们会对 C语言中的位运算和文件进行解析,相信这两章对于一些人来说是陌生的,由于非常多 老师都会跳过 ...