1.字符编码(******):
字符---------------》编码(参照字符编码表)-----------------》数字
字符---------------《解码(参照字符编码表)-----------------《数字
字符编码表:
ASCII表:最早科学家使用8位二进制,只认识英文字符
英文字符对应8bit 8bit=1Bytes
GBK:使用16位二进制,支持英文与中文字符
1个字符对应16bit 16bit=2Bytes
Shift-JIS:支持英文与日文字符
EUC-KR:支持英文与韩文字符
Unicode:支持万国字符
常用的字符:一个字符对应两个字节
历史使命:1、兼容万国字符。2、兼容老的字符编码表
utf-8:把Unicode做了一个优化
一个英文字符---》1Bytes
一个中文字符---》3Bytes
内存 硬盘
万国字符------------》unicode格式的二进制数-----------》utf-8格式的二进制数
中、英字符-------》unicode格式的二进制数------》gbk格式的二进制数
保证不乱码:
1、首先得保证存不乱码
内存不用管,内存固定使用unicode,存入硬盘的编码格式改为utf-8
2、再保证取不乱
编码与解码用的是同一张字符编码表
Python3默认读文件为utf-8,python2默认为ASCII
2.文件处理的高级部分
2.1 文件处理的其他方法
with open('a.txt',mode='rt',encoding='utf-8') as f:
print(f.readable()) #检查文件是否可读
print(f.writable()) #检查文件是否可写
line = f.readline() #文件读一行
print(line)
line = f.readline()
print(line)
lines = f.readlines()
print(lines)
with open('a.txt',mode='wt',encoding='utf-8') as f:
names = ["egon","tom","lili"]
for name in names:
f.write(name) #依次写入文件
f.writelines(names) #文件中写入一序列的字符串
f.flush() #刷新
2.2 控制文件指针移动
主动控制文件指针移动
控制文件内指针移动的单位:只有t模式下的read(n)代表的是字符个数,除此之外全都是字节个数
0模式:f.seek(3,0)--- 参照文件开头指针位置
(只有0模式可以在t下使用,0也可以在b模式 下使用)
1模式:f.seek(3,1)---》参照文件当前指针位置
2模式:f.seek(3,2)---》参照文件末尾指针位置
1和2模式要在b下使用
2.3 文件修改的两种方式
方式一:
1、将文件内容一次性全部读入内存
2、在内存中将内容修改完毕
3、将新内容写回原文件
with open('b.txt',mode='rt',encoding='utf-8') as f1:
data = f1.read()
res=data.replace("egon",'EGON')
with open('b.txt', mode='wt', encoding='utf-8') as f2:
f2.write(res)
方式二:
1、以读的方式打开源文件,以写的方式打开一个临时文件
2、从源文件中读出一行内容都内存中,修改完毕后再写入临时文件,循环往复直到读完原件
3、删除源文件,将临时文件改名为源文件名
import os
with open('b.txt',mode='rt',encoding='utf-8') as src_f,\
open('.b.txt.swp',mode='wt',encoding='utf-8') as dst_f:
for line in src_f:
dst_f.write(line.replace('EGON','egon'))
os.remove('b.txt')
os.rename('.b.txt.swp','b.txt')