文件内光标的移动
- 文本模式下read()括号内的数字表示读取几个字符
| with open(r'a.txt', 'r', encoding='utf8') as f: |
| data = f.read(3) |
| print(data) |
- 二进制模式下read()括号内的数字表示读取及格字节(英文1字节,中文3字节)
| with open(r'a.txt', 'rb') as f: |
| data = f.read(3) |
| print(data.decode('utf8')) |
tell方法
seek方法
- 之前文件内指针的移动都是由读/写操作而被动触发的,若想读取文件某一特定位置的数据,则需要用seek方法主动控制文件内指针的移动
- .seek(offset,whence)
- offset:指针移动的字节数
- whence:模式控制
- 0模式(默认模式):基于文件开头移动的多少字节
- 1模式:基于光标当前所在位置移动多少字节(只能在二进制模式(b模式)下使用)
- 2模式:基于文件末尾移动多少字节(只能在二进制模式(b模式)下使用)
0模式详解
| |
| abc你好 |
| |
| |
| with open('a.txt',mode='rt',encoding='utf-8') as f: |
| f.seek(3,0) |
| print(f.tell()) |
| print(f.read()) |
| |
| |
| with open('a.txt',mode='rb') as f: |
| f.seek(6,0) |
| print(f.read().decode('utf-8')) |
1模式详解
| |
| with open('a.txt',mode='rb') as f: |
| f.seek(3,1) |
| print(f.tell()) |
| f.seek(4,1) |
| print(f.tell()) |
2模式详解
| |
| abc你好 |
| |
| |
| with open('a.txt',mode='rb') as f: |
| f.seek(0,2) |
| print(f.tell()) |
| f.seek(-3,2) |
| print(f.read().decode('utf-8')) |
| |
| |
| import time |
| with open('access.log',mode='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='') |
文件内数据修改
修改文件的方式
- 文件对应的是硬盘空间,硬盘不能修改对应的文件本质也不能修改。
1.覆盖写
- 实现思路:先读取文件的内容一次性全部读入到内存,在内存中完成修改再覆盖写回原文件
- 优点:硬盘只占用一块空间
- 缺点:数据量较大的时候会造成内存溢出
| with open(r'demo.txt','r',encoding='utf8') as f: |
| data = f.read() |
| new_data = data.replace('DSB','NB') |
| with open(r'demo.txt','w',encoding='utf8') as f1: |
| f1.write(new_data) |
2.重命名
- 实现思路:先读取文件内容到内存,在内存中完成修改,之后保存到另一个文件中再将原文件删除,将新的文件重命名为原文件
- 优点:不会占用过多的内存(不会造成内存溢出)
- 缺点:在文件修改过程中同一份数据存了两份,也可能是在内存中创建没有刷到硬盘
| 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('NB', 'SB')) |
| os.remove('demo.txt') # 删除文件 |
| os.rename('.demo.txt.swap', 'demo.txt') # 重命名文件 |
函数简介
- 概念:函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
- 自定义统计方法:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
- 自定义统计缺陷:
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) |
| |
| print(len(l1)) |
| print(my_len()) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY