其他文本模式补充
- r+ 可读可写
- w+ 可读可写
- a+ 可读可写
另外,rwa为纯净模式
在rt模式下,read内( )中的数字表示的是字符的个数;除此之外,数字表示的都是字节
控制文件内容光标的移动
with open(r'test','r',encoding='utf-8') as f: f.seek(offset,whence)
offset:
- 相对偏移量,光标移动的位数
whence:
- 0:参照文件的开头,t和b模式都可以使用
- 1:参照光标所在的当前位置,只能在b模式下用
- 2:参照文件的末尾,只能在b模式下使用
with open(r'test','rt',encoding='utf-8') as f: print(f.read(1)) f.seek(6,0) # seek移动的都是字节数 print(f.read(1)) f.seek(0,0) # 移动到首位 print(f.read(1))
with open(r'test','rb',encoding='utf-8') as f: print(f.read(3).decode('utf-8')) f.seek(0,0) print(f.read(3).decode('utf-8'))
with open(r'test','rt',encoding='utf-8') as f: print(f.read(3)) f.seek(1,1) print(f.read(1)) # 报错,此时光标已在最末位,无法再读取
with open(r'test','rb',encoding='utf-8') as f: print(f.read(3)) f.seek(3,1) print(f.read(1))
with open(r'test','rt',encoding='utf-8') as f: print(f.read()) f.seek(3,2) print(f.read(1)) f.seek(-3,2) print(f.read())
with open(r'test','a',encoding='utf-8') as f: print(f.read()) f.seek(3,2) print(f.read(1)) f.seek(-3,2) print(f.read())
实时监测文件内容变化
import time res = time.strftime('%Y-%m-%d %X') print(res,type(res)) with open(r'test','a',encoding='utf-8') as f: f.write('%s egon给jason发了一个亿的工资 '%res)
进阶:实时检测是否有新内容增加
with open(r'test01.txt','rb',encoding='utf-8') as f: f.seek(0,2) # 先将光标移动到文件末尾 while True: res = f.readline() print(f.tell()) # 查看光标移动了多少位(字节) if res: print('新增的文件内容:%s'%res.decode('utf-8')) # if如果res有值,说明有人操作当前文件 else: # 如果res没有值,说明文件没有被任何人操作 print('暂无其他人操作文件') print(f.read())
截断文件:
with open(r'test','a',encoding='utf-8') as f: f.truncate(6) # 保留0~6字节数,后面的全部删除(截断)。接收的字节的长度,必须为int整型数据
文件修改:
先将数据由硬盘读到内存(读文件),在内存中完成修改(字符串的替换),再覆盖原来的内容(写文件)。
注意:同一个文件不能同时使用两种模式(rwa),不能既读又写。
- 1)文件修改方式1:类似于覆盖
with open(r'test','r+',encoding='utf-8') as f: f.seek(6,0) f.write('到')
with open(r'test','r',encoding='utf-8') as f: data = f.read() print(data) print(type(data))
with open(r'test','w',encoding='utf-8') as f: res = data.replace('egon','jason') print(data) f.write(res)
'''
但是上面这种方法也有优缺点;
优点:任何时候,硬盘上只有一个文件,不会占用过多的硬盘空间
缺点:当文件过大时,可能会造成内存溢出
'''
- 2)文件修改方式2:类似于搬运
创建一个新文件,循环读取老文件内容到内存进行修改,将修改好的内容写到新文件中,将老文件删除,将新文件的名字改成老文件名字。
import os # 调用os模块 with open(r'test1','r',encoding='utf-8') as read_f, open(r'test2','a',encoding='utf-8') as write_f: for line in read_f: new_line = line.replace('jason','egon') write_f.write(new_line) os.remove('test1') os.rename('test2','test1')
'''
这种方式也有优缺点:
优点:内存中始终只有一行内容,不占内存
缺点:在某一时刻,硬盘上会同时存在两个文件,占用硬盘空间,但是这个时间段很短
'''
函数简介
什么是函数?
函数就是工具,函数必须先定义后调用(函数名+括号)
为什么要有函数?(待定)
如何是使用函数?(待定)
函数体代码定义阶段只检测语法,不执行代码
def my_len() # def为定义函数的关键字 n = 0 for i in l: n += 1 print(n) my_len() print(my_len())
'''
可以通过变量名找到变量对应的值;
可以通过函数名+括号,找到函数体所对应的代码并执行;
函数名的命名规则与变量名相同;