day12 文件操作(下)
一、x模式(控制文件操作模式,与rwa同级)
1 特点
创建不存在文件,文件存在则报错
可写不可读
2 格式
with open('d.txt',mode='x',encoding='utf-8') as f:
f.write('哈哈哈\n')
#d文件存在则报错,不存在则创建并写入哈哈哈
二、b模式(控制文件读写内容的模式,与t同级)
1.b模式和t模式的区别
t模式:
- 读写都必须是以字符串(uncode)为单位
- 只能针对文本文件
- 必须指定字符编码,即必须指定encoding参数
- 硬盘的二进制读入内存-》t模式会直接把内存中的二进制encode解码
b模式(binary):
- 读写都是以bytes为单位
- 可以针对所有文件
- 一定不能指定字符编码,即一定不能指定encoding参数
- 硬盘中的二进制读入内存-》b模式下不会做任何操作,直接读入内存
总结:在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码和解码,所以t在纯文本的操作上更方便。非纯文本文件只能用b模式
2 b模式应用
with open("a.txt","rb") as f :
print(f.read().decode("utf-8"))
#在b模式下如果想读文本文件,必须要以源文件存的方式解码,如果没有这一步操作输出的是一个bytes类型
#同理,在写文件的时候,就要以文件同样格式去编码
with open(r"cvc.txt","wb") as f :
f.write("aaaa".encode("utf-8"))
3 循环读取文件
方式一:自己控制每次读取的数据的数据量(while)
with open(r"cvc.txt","rb") as f :
while True:
res = f.read(5)#控制每次只读5个字节的数据
print(res)
if len(res) == 0:
break
方式二:每次读一行(for)
with open(r"cvc.txt","rb") as f :
for line in f:
print(line)
三、文件操作的其他方法
1 读相关操作
1.1readline:一次读一行
with open(r"cvc.txt","rt",encoding="utf-8") as f :
res = f.readline()
print(res)
1.2readlines:把文件内容存放到列表内,以换行符分隔
with open(r"cvc.txt","rt",encoding="utf-8") as f :
res = f.readlines()
print(res)
>>>['aaaa\n', '12321\n', '123123\n', '123123\n', '12321\n', '213312\n', '123\n', '123']
强调:read和readlines都是将文件所有的内容读到内存中,如果文件过大,容易内存溢出
2 写相关操作
2.1writelines:readlines的反操作,把列表中的数据写到文件中
with open(r"cvc.txt","wt",encoding="utf-8") as f :
f.writelines(["aaa","BBB"])#不能写数字
补充1:b模式下,如果是纯英文和数字可以在前面加b前缀得到bytes类型
l = [
b'1111aaa1\n',
b'222bb2',
b'33eee33'
]
l = [
'1111aaa1\n'.encode('utf-8'),
'222bb2'.encode('utf-8'),
'33eee33'.encode('utf-8')
]
#这两者效果相同
补充2:'上'.encode('utf-8') 等同于bytes('上',encoding='utf-8')
3 flsh刷新
with open('h.txt', mode='wt',encoding='utf-8') as f:
f.write('哈')
f.flush()
#操作系统在把应用程序的数据写入文件时不是瞬时的,需要攒到一定量再执行,flush可以忽略这个设定直接执行。
4 了解
with open('h.txt', mode='wt',encoding='utf-8') as f:
print(f.readable())#判断文件是否可读
print(f.writable())#判断文件是否可写
print(f.encoding)#读取文件存放的字符编码
print(f.name)#读取文件名称
print(f.closed)#判断文件是否关闭
>>>False
>>>True
>>>utf-8
>>>h.txt
>>>True
四、文件高级操作:控制文件指针的移动
前提:文件指针移动的单位是bytes
只有一种情况下特殊,t模式我们读取文件时,获得的是字符串,所以这个时候指针移动的单位是字符
with open('aaa.txt',mode='rt',encoding='utf-8') as f:
res=f.read(4)
print(res)
f.seek(n,模式)n代表的是移动的字节数
1 模式0:参照物是文件开头
with open(r"cvc.txt","rb") as f :
f.seek(5,0)#从开头把光标移动到底5个字节处
f.seek(111,0)#从开头把光标移动到第111字节处,如果没有这么多,就移到最后一个
2 模式1:参照物是光标当前所在位置
with open(r"cvc.txt","rb") as f :
f.seek(3,1)#在第三个字节处
f.seek(1,1)#在第四个字节处
3 模式2:参照物是文件末尾,应该是倒着移动的n为负数
with open(r"cvc.txt","rb") as f :
f.seek(-1,2)#在文件倒数第一个字节处
f.seek(-2,2)#在文件倒数第二个字节处
强调 0模式可以在t模式下使用,1,2模式只能在b模式下使用
4 tell获取文件当前光标所在位置
with open(r"cvc.txt","rb") as f :
f.seek(-1,2)
f.seek(-2,2)
res = f.tell()
print(res)
>>>3
五、文件修改
强调
- 硬盘空间是无法修改的,硬盘中的数据的更新都是用新的值取覆盖旧的值
- 内存中的数据是可以修改的
# 文件a.txt内容如下
张一蛋 山东 179 49 12344234523
李二蛋 河北 163 57 13913453521
王全蛋 山西 153 62 18651433422
# 执行操作
with open('a.txt',mode='r+t',encoding='utf-8') as f:
f.seek(9)
f.write('<妇女主任>')
# 文件修改后的内容如下
张一蛋<妇女主任> 179 49 12344234523
李二蛋 河北 163 57 13913453521
王全蛋 山西 153 62 18651433422
因此如果需要修改文件,只能把文件的数据从硬盘读到内存中,然后在内存中修改最后覆盖源文件
方式一
#实现思路:讲文件的内容一次性全部读入内存中,然后再内存中修改,最后覆盖原文件
#优点:在文件修改的过程中只有一个文件
#缺点:一次性读入内存会过多占用内存空间
with open("b.txt","r",encoding="utf-8") as f :
info = f.read()
with open("b.txt","w",encoding="utf-8") as f1:
f1.write(info.replace("a","b"))
方式二
#实现思路:打开原文件的同时,创建一个临时文件,把原文件的数据一行一行的读入内存,再保存到临时文件,最后把原文件删除,重命名临时文件
#优点:不会占用很多内存空间,同时出现在内存中的数据只有一行
#缺点:文件修改的过程中会出现两个文件
import os
with open("b.txt","r",encoding="utf-8") as f1,\
open(".b.txt.swap","w",encoding="utf-8") as f2:
for line in f1:
f2.write(line.replace("b","a"))
os.remove("b.txt")
os.rename(".b.txt.swap","b.txt")
day12 文件操作(下)的更多相关文章
- Windows与Linux下文件操作监控的实现
一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场 ...
- Linux C 下的大文件操作
这里说的大文件指大小超过4G的文件. 在32位环境下,linux默认打开.读.写超过4G的文件会返回错误.定义如下宏可以突破这个限制,对read/write和fread/fwrite同时有效. 注意它 ...
- Linux下普通IO文件操作函数---C语言
普通文件IO总结 FILE结构体 typedef struct { int level; /*填充/清空一级缓存*/ unsigned flag; /*文件状态指针*/ ...
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
c#中@标志的作用 参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...
- Linux(C/C++)下的文件操作open、fopen与freopen
open是linux下的底层系统调用函数, fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲. linxu下的fopen是open的封装函数,fopen最终还是要调用底层的 ...
- 归纳整理Linux下C语言常用的库函数----文件操作
在没有IDE的时候,记住一些常用的库函数的函数名.参数.基本用法及注意事项是很有必要的. 参照Linux_C_HS.chm的目录,我大致将常用的函数分为一下几类: 1. 内存及字符串控制及操作 2. ...
- C# WPF Application 下的文件操作
好气哦,电脑好烂,每天花大把的时间在等电脑反应上. 没有钱买新电脑,连组台式机的钱都没有.好气哦. 啊啊啊啊文件操作是什么鬼???C++下我都懵了,C#下好多东西要学!!!我不会!我不会!我不会!!! ...
- qt在linux下使用open,write,close等文件操作
正常在linux下使用的文件操作函数为: #include <fcntl.h>fd = open(“path”,O_RDWR|O_NONBLOCK); 但是在qt中,需要使用: #incl ...
- Linux(C/C++)下的文件操作open、fopen与freopen via Boblim
Linux(C/C++)下的文件操作open.fopen与freopen open是linux下的底层系统调用函数,fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲. li ...
随机推荐
- 来看看阿里架构师Java 代码打日志姿势!你也是这样写的吗
使用slf4j 使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一. 实现方式统一使用: Logback框架 打日志的正确方式 什么时候应该打日志 当你遇到问题的时候,只能通过debug功能 ...
- 2020阿里最新出品的泰山版Java开发手册,告别垃圾代码
说起华山,我就想起岳不群,不,令狐冲:说起泰山,我就想起司马迁,他的那句名言"人总有一死,或重于泰山,或轻于鸿毛",真的发人深省啊.这就意味着,阿里出品的泰山版 Java 开发手册 ...
- 深入理解PHP原理之Opcodes
Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL. 举个例子,比如你写下了如下的PHP代码: <?php echo "Hello Wo ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.0)- FlexSPI NOR启动时间(RT1170)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1170 FlexSPI NOR启动时间. 痞子衡刚刚拿到i.MXRT1170 B0版本的芯片,迫不及待地在上面跑了 ...
- 记录一次Flink作业异常的排查过程
最近2周开始接手apache flink全链路监控数据的作业,包括指标统计,业务规则匹配等逻辑,计算结果实时写入elasticsearch. 昨天遇到生产环境有作业无法正常重启的问题,我负责对这个问题 ...
- Azure AD B2C(二)使用Azure AD B2C为ASP.NET Core 应用设置社交帐户(邮箱)登录/注册
一,引言 上次关于Azure AD B2C 讲到一些概念,有介绍到,Azure AD B2C 也是一种身份验证的解决方案,但是它运行客户使用其首选的社交,企业或者本地账户标识对应用程序和API进行单一 ...
- 解除git文件处于lock状态方法
解决办法: 去git文件夹下删除lock文件就可以
- 一文梳理JavaScript中的this
最近零零碎碎看了许多关于this的文章,本着"好记性不如烂笔头"的思想,特在这里整理一下this有关的知识点.[长文警告!!!] 接下来,笔者将按照以下目录对this进行阐述: t ...
- 拿来即用:用C+JS结构来处理JSON数据
[面对的问题] 在物联网产品的开发过程中,对JSON格式的数据处理是一个强需求,例如亚马逊的 AWS IOT平台,设备与后台之间的通讯数据都是JSON格式,先瞄一眼大概的样子: 这是一个真实产品的通讯 ...
- 版本控制工具 GIT入门教程
GIT 在团队中的中作流程 1.每个程序员在自己的分支上进行开发 2.主程序猿/Leader合并程序员程序 3.程序员之间也可以对一下提交冲突进行合并 下载和安装 GIT官方网址:http:// gi ...