python day07 字符编码、文件处理高级
1、字符编码(*****)
-
字符编码
编码:字符编码表
字符——————————>>>数字
解码:字符编码表
字符<<<——————————数字
-
字符编码表
ASCII:只认识英文字符
1英文字符对应8bit=1Byte
1024Byte=1KB
1024KB=1MB
1024MB=1GB
1024GB=1TB
1024TB=1PB
GBK编码:支持英文字符与中文字符
1个字符对应16bit===2Bytes
Unicode:支持万国字符
常用的字符
1个字符对应2个字节
历史使命:
1、兼容万国字符
2、兼容老的字符编码表
utf-8:把unicode做了一下优化
1个英文字符——>1Byte
1个中文字符——>3Bytes
万国字符——————>unicode格式的二进制数(内存)——————>utf-8格式的二进制数(硬盘)
中文、英文字符——————>unicode格式的二进制数(内存)——————>gbk格式的二进制数(硬盘)
1、保证不乱码:
-
首先保证存的时候不乱码如何保证
往内存时不用管,计算机默认内存unicode
往硬盘存的时候得以utf-8的形式
-
编码与解码用的是同一张字符编码表
2、如何保证取得时候不乱码:
编码与解码用的是同一张字符编码表
python3解释器默认读文件的编码格式是utf-8
python2解释器默认读文件的编码格式是ascii
2、文件处理高级部分
-
文件处理的其他方法
with open('a.txt','w',encoding='utf-8') as f:
names = ['egon', 'tom', 'lili']
f.writelines(names) # 遍历names每遍历一个写一次
f.write('aah')
f.flush() # 保证数据的几时率但会牺牲性能 -
控制文件指针移动
控制文件内指针移动的单位:只有t模式下的read()代表字符个数,除此之外全都是字节个数
'hello你好'
with open('a.txt', 'r', encoding='utf-8') as f:
f.read(6) # 6个字符
>>>>hello你
with open('a.txt', 'rb') as f:
f.read(6) # 6个字节
>>>>报错(英文1个字节,中文要3个字节)
with open('a.txt', 'rb') as f:
f.read(8) # 6个字节
>>>>hello你主动控制文件指针移动
# 0模式:参照文件开头移动n个字节
f.seek(3,0)
f.seek(3,0)
f.seek(6,0)
# 1模式:参照当前所在位置移动n个字节
f.seek(3,1)
f.seek(6,1)
# 2模式:参照文件末尾移动n个字节
f.seek(-3,2)
f.seek(-6,2)
# ps:在t下只有0模式可以使用,1和2模式都只能在b下使用文件指针跳到末尾的两种方式:f.seek(0,2) 以a模式打开文件
-
文件修改的两种方式
方式一:
1.将文件内容一次性全部读入内存
2.在内存中将内容修改完毕
3.将新内容写回源文件
with open('a.txt', 'r', encoding='utf-8') as f:
data = f.read().replace('egon','EGON')
with open('a.txt', 'w', encoding='utf-8') as f:
f.write(data)
方式二:
1.以读的方式打开源文件,以写的方式打开一个临时文件
2.从源文件中读出一行内容到内存中,修改完毕后再写入临时文件,循环往复直到读完源文件
3.删除源文件,将临时文件改名为源文件名
import os
with open('a.txt', 'r', encoding='utf-8') as f1,open('.b_swp.txt', 'w', enconding='utf-8') as f2:
for line in f1:
f2.write(line.replace('egon','EGON'))
os.remove('b.txt')
os.rename('.b_swp.txt','a.txt') -
日志检测
import arrow
# print(arrow.now().format("YYYY-MM-DD HH:mm:ss"))
with open('access.log','a',encoding='utf-8') as f:
f.write(f'{arrow.now().format("YYYY-MM-DD HH:mm:ss")} "陈浩欠我一个亿"\n')
import time
with open('access.log', 'rb') as f:
f.seek(0, 2)
while True:
line = f.readline()
if len(line) == 0:
time.sleep(1)
else:
print(line, end='') -