文件操作模式
一、文件操作
1、wr模式结合
w = open('1.txt', 'w', encoding='utf-8') # w:没有文件新建文件,有文件就清空文件 w.write('000\n') w.flush() # 在写入大量数据,要及时处理内存空间,不然内存可能溢出导致数据丢失 w.write('111\n') w.flush() # 最后一次flush()操作可以省略 w.writelines(['222\n', '333\n']) # 一次性写入多行 w.write('444') w.write('555') w.close() # 1.将内存的的数据刷新到硬盘中;2.释放文件资源
# 需求: # 完成文本类型的文件复制:1.txt => 11.txt r = open('1.txt', 'r', encoding='utf-8') w = open('11.txt', 'w', encoding='utf-8') for line in r: # 遍历就是一行一行读 取读文件的流 w.write(line) w.flush() w.close() r.close()
2、文件操作模式
①主模式:
r 读 r+:不会创建文件的可读可写 w 写 w+:创建清空文件的可读可写 a 追加 a+:创建不清空文件的可读可写
②从模式:
t 文本操作(默认模式),要规定文本的编码格式utf-8 b 飞文本文件必须采用二进制模式处理,不需要规定文本的编码格式。 + 可读可写 x 写,必须有自己的文件,否则会报错
③a为写模式,在原数据后追加写入新数据(追加写入)
# temp.txt # 111222333 with open('temp.txt', 'a', encoding='utf-8') as f: f.write('new msg') # 结果为:111222333new msg
3、文件的复制:就是先读后写
①文本类型文件的复制
rw模式: r = open('1.txt', 'r', encoding='utf-8') w = open('11.txt', 'w', encoding='utf-8') for line in r: # 遍历就是一行一行读 取读文件的流 w.write(line) w.flush() w.close() r.close()
②with open完成文本文件的复制:边读边写。(with open 将文件的释放交给with管理,当with中逻辑结束后,系统自动释放文件)
with open('souurce.txt','r',encoding='utf-8') as f1: with open('target.txt','a+',encoding='utf-8') as f2: for line in f1: f2.write(line)
③非文本文件的复制:从模式采用b模式,不需要关心编码问题
案例:复制source.mp4为target.mp4 with open('source.mp4', 'rb') as f1: with open('target.mp4', 'wb') as f2: for line in f1: f2.write(line)
二、游标操作
必须在b模式下操作,seek中偏移的是字节
1、游标方法:seek(偏移量,偏移位置)
偏移量:移动的字节数 偏移位置: 1——从当前游标位置开始偏移 0——从文件开始位置开始偏移 2——从文件末尾开始偏移
2、游标的读写操作
①游标读 with open('source.txt', 'rb') as f: d1 = f.read(11) print(d1) print(d1.decode('utf-8')) # 当前游标的位置 print(f.tell()) # 游标操作 - 从末尾位置开始 f.seek(-3, 2) d2 = f.read() print(d2.decode('utf-8')) # 890 # 游标操作 - 从当前位置开始 f.seek(-3, 1) d2 = f.read() print(d2.decode('utf-8')) # 34567890 # 游标操作 - 从头开始 f.seek(3, 0) d2 = f.read() print(d2) print(d2.decode('utf-8')) # 好1234567890 ②游标写:会覆盖书写 with open('source.txt', 'rb+') as f: f.seek(11) print(f.read()) f.write(b'000')
3、案例
# 案例 with open('001.png', 'rb') as f: data = f.read() print(len(data)) # 在大文件中,开头| 1/3 | 2/3 | 末尾 各取10个字节拼接成秒传的信息依据 # 形成秒传规则 tagData = b'' with open('001.png', 'rb') as f: # 通过其他途径(sys模块)来获取文件总大小 data = f.read() length = len(data) # 开头 f.seek(0, 0) d1 = f.read(10) # 1/3 f.seek(length // 3, 0) d2 = f.read(10) # 2/3 f.seek(length // 3 * 2, 0) d3 = f.read(10) # 末尾 f.seek(-10, 2) d4 = f.read(10) tagData = d1 + d2 + d3 + d4 # 秒传依据 print(tagData) newData = b"" with open('001.png', 'rb') as f: data = f.read() length = len(data) f.seek(0, 0) newData += f.read(10) f.seek(length // 3, 0) newData += f.read(10) f.seek(length // 3 * 2, 0) newData += f.read(10) f.seek(-10, 2) newData += f.read(10) if newData == tagData: print('秒传成功') else: print('慢慢传去吧')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现