文本编辑r+/w+/a+模式、光标移动及文件的截取与修改
内容回顾:字符串与UTF-8之间的转化
方法一:
x = '上' res1 = bytes(x,encoding='utf-8') # 定义为bytes类型,encode print(res1,type(res1)) # b'\xe4\xb8\x8a' <class 'bytes'> 转化完成 res2 = str(res1,encoding='utf-8') # 定义为字符串类型,decode print(res2,type(res2)) # 上 <class 'str'>转化完成
方法二:
x = '上' res = x.encode('utf-8') # 固定格式 print(type(res)) # <class 'bytes'> print(res.decode('utf-8')) # 上
文本编辑其他模式:r+ , w+ , a+ (test.py文件里面初始内容为“你说啥”)
r+模式:(默认为r+t)
with open(r'test.py',mode='r+',encoding='utf-8') as f: print(f.readable()) # True print(f.writable()) # True print(f.readline()) # 你说啥 f.write('嘿嘿嘿') # 你说啥嘿嘿嘿 # r+模式下文本可读可写
ps:在r+t模式下,read内的数字表示的是字符的个数;除此之外,数字都表示的是字节。如:
with open(r'test.py','rb') as f: res = f.read(6) # 读的是三个字节bytes print(res) # b'\xe4\xbd\xa0\xe8\xaf\xb4' print(res.decode('utf-8')) # 你说
w+模式:(默认为r+t)
with open(r'test.py',mode='w+',encoding='utf-8') as f: print(f.readable()) # True print(f.writable()) # True print(f.readline()) # 被清空 f.write('嘿嘿嘿') # 嘿嘿嘿 # w+模式下可读可写,但是先清空文件内容再进行写入
r+b模式:
with open(r'test.py',mode='r+b') as f: print(f.readable()) # True print(f.writable()) # True res = f.read() # 你说啥 # r+t模式下可读可写
文件内光标的移动:
格式:f.seek(offset,whence)
offset:相对偏移量(光标移动的位数)
whence:只能是0、1、2其中的一个;其中:
0:参照文件的开头,t和b模式都可以使用;
1:参照光标所在的当前位置,只能在b模式下使用;
2:参照文件的末尾,只能在b模式下使用。
PS:这里面的offset移动的都是字节数
练习:实时监测文件内容:
with open(r'test.py', 'r+b') as f : f.seek(0,2) # 光标移动到最后 while True : res = f.readline() print(f.tell()) # 查看光标移动了多少Bytes if res : print('新增的内容:%s'%res.decode('UTF-8')) else : print('暂无改动')
截断文件:truncate(n):括号内表示保留0~n个字节数,后面的全部删除(截断 )
修改文件:两种方式。
方式一:
①先将数据由硬盘读取到内存中(读文件)
②在内存中完成修改(字符串的替换)
③再覆盖原来的文件(写文件)
# 测试01中的内容为(asdfghjk) with open(r'测试01.py','r',encoding='utf-8') as f: data = f.read() print(data) # asdfghjk print(type(data)) # <class 'str'> with open(r'测试01.py','w',encoding='utf-8') as f: res = data.replace('a','z') print(data) # asdfghjk f.write(res) # 测试01中的内容变为(zsdfghjk)
优点:任意时间硬盘上只有一个文件,不会占用过多的硬盘空间。
缺点:当文件过大时,可能造成内存溢出。
方法二:
①创建一个新文件
②循环读取老文件内容到内存进行修改,并将修改好的内容写到新的文件中
③将老文件删除,将新的文件改成老文件名
# 测试01中的内容为(asdfghjk) import os with open(r'测试01.py','r',encoding='utf-8') as read_f,\ open(r'测试01.py.swap','a',encoding='utf-8') as write_f: # 表示新创建的文件 for line in read_f: new_line = line.replace('a','z') # 将f文件中的a改为z write_f.write(new_line) # 在新文件中写入new_line的内容 os.remove('测试01.py') # 删除原文件 os.rename('测试01.py.swap','测试01.py') # 将新文件命名为老文件的名字 # 测试01中的内容变为(zsdfghjk)
优点:内存中始终只有一行内容,不占内存。
缺点:在某一时刻硬盘上会同时存在两个文件。
函数:
格式:def 函数名() : # 函数名的命名规则与变量一样
代码
print(函数名())
# 可以通过变量名找到变量对应的值,而函数可以通过函数名()找到函数体对应的代码并执行。
# 函数就是工具,必须先定义后调用(函数名+括号)