【python基础】第14回 文件处理 光标与数据
本章内容概要
1.文件内光标的移动
2.文件数据修改
3.函数简介
本章内容详细
1.文件内光标的移动
1.1 read(数字)
#在文本模式下read括号内的数字表示读取几个字符
with open(r'a.txt', 'r', encoding='utf8') as f: data = f.read(3) print(data) # a你好
在二进制模式下read括号内的数字表示读取几个字节(英文一个字节 中文三个字节)
with open(r'a.txt', 'rb') as f: data = f.read(4) print(data.decode('utf8')) # a你
1.2 代码控制光标移动
1.tell() 获取光标移动的字节数
with open(r'a.txt', 'r', encoding='utf8') as f: data = f.read(3) print(data) # a你好 print(f.tell()) # 7
2.seek(offset,whence)
offset 控制光标移动的位移量(字节)
whence 模式
0 基于文件开头移动多少字节
1 基于光标当前所在位置移动多少字符
2 基于文件末尾移动多少字节
1和2 只能在二进制模式下使用 0 无所谓
# 0 基于文件开头移动多少字节 with open(r'a.txt', 'r', encoding='utf8') as f: data = f.read() print(data) # a你好你好 f.seek(1,0) print(f.read()) # 你好你好
1 基于光标当前所在位置移动多少字节
with open(r'a.txt', 'rb') as f: data = f.read(4) print(data.decode('utf8')) # a你 f.seek(-3, 1) print(f.read().decode('utf8')) # 你好我他
2 基于文件末尾移动多少字节
with open(r'a.txt', 'rb') as f: data = f.read() print(data.decode('utf8')) # a你好我他 f.seek(-3, 1) print(f.read().decode('utf8')) # 他
# 小练习:实现动态查看最新一条日志的效果
import time with open('access.log', 'rb') as f: f.seek(0, 2) while True: line = f.readline() if len(line) == 0: # 没有内容 time.sleep(0.5) else: print(line.decode('utf-8'), end='') with open(r'access.log', 'a', encoding='utf8') as f: f.write('新加入') f.write('再加入')
2.文件数据修改
2.1 原理与方式
机械硬盘存储数据的原理
1.数据的修改 其实是覆盖写
2.数据的删除 占有态自由态
代码修改文件的方式
文件对应的是硬盘空间,硬盘不能修改对应着文件本质也不能修改,
那我们看到文件的内容可以修改,是如何实现的呢?
大致的思路是将硬盘中文件内容读入内存,然后在内存中修改完毕后再覆盖回硬盘
具体的实现方式分为两种:
1.覆盖写 :先读取文件内容到内存 在内存中完成修改 之后w模式打开该文件写入
2.重命名 :先读取文件内容到内存 在内存中完成修改 之后保存到另外一个文件中,再将原文件删除 将新的文件重命名为原文件
# 文件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 # 强调: # 1、硬盘空间是无法修改的,硬盘中数据的更新都是用新内容覆盖旧内容 # 2、内存中的数据是可以修改的
2.2 覆盖写
优点:硬盘只占用一块空间
缺点:数据量较大的时候会造成内存溢出
# 方式1:覆盖写 with open(r'demo.txt', 'r', encoding='utf8') as f: data = f.read() print(data) new_data = data.replace('NB', 'DB') with open(r'demo.txt', 'w', encoding='utf8') as f1: f1.write(new_data) print(new_data)
2.3 重命名
优点:不会造成内存溢出
缺点:有那么一段时间需要占用硬盘两个地方的空间(可能) 也可能是在内存中创建没有刷到硬盘
import os with open('demo.txt', 'r', encoding='utf8') as read_f, \ open('.demo.txt.swap', 'w', encoding='utf8') as wrife_f: for line in read_f: wrife_f.write(line.replace('DB', 'SDB')) os.remove('demo.txt') # 删除文件 os.rename('.demo.txt.swap', 'demo.txt') # 重命名文件
3.函数简介
我们自己瞎写的缺陷
1.只能统计某个固定的数据类型里面的数据值个数
2.没有产生新的值(返回值)
l1 = [1, 2, 3, 4, 5, 6] # print(len(l1)) # 不允许使用len 完成列表数据值个数统计 # 自定义统计方法 def my_len(): value_count = 0 for i in l1: value_count += 1 print(value_count)
1.循环
在相同的位置反复执行相同的代码
2.函数
在不同的位置反复执行相同的代码
分类:
python 基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)