字符编码和文件处理
字符编码和文件处理
1.字符编码
字符-------------------编码>字符编码表------------------>>>二进制数字
二进制数字---------->解码>字符编码表---------------->>>字符
2.字符编码表
ASCII:只认识英文字符,一个英文字符对应8bit
8bit = 1Byte
GBK:只认识中文字符和英文字符,一个字符对应16bit
shift-JIS:支持英文字符与日文字符
EUC-KR:支持英文字符与韩文字符
unicode:支持万国字符,1个字符对应2个字节
历史使命:1.兼容万国字符
2.兼容老的字符编码表
utf-8:优化了unicode,一个英文字符对应一个字节,一个中文字符对应3个字节
现在我们的内存都使用unicode
内存 硬盘
万国字符-----------》unicode格式的二进制数--------》utf-8格式的二进制数
中文、英文字符- ----》unicode格式的二进制数--------》gbk格式的二进制数
日文、英文字符- ----》unicode格式的二进制数--------》shift-jis格式的二进制数
怎么样保证写程序时不乱码:
1.存内存不应管,都会转为unicode,存硬盘都用utf-8
2.编码和解码用的时同一张字符编码表
python3解释器默认读文件的编码格式是utf-8
python2解释器默认读文件的编码格式是ASCII
python解释器执行文件的3个阶段
1.前两个阶段
执行py文件的前两个阶段就是python解释器读文本文件的过程,与文本编辑读文本文件的前两个阶段没人任何区别
如果想让python不用默认的方式编码,就加上文件头:
#coding:gbk
2.第三个阶段
识别python语法
为了能让识别语法是不乱码,就在字符串前加上个u。
3.文件处理
f.readable() 判断文件是否可读
f.writable() 判断文件是否可写
f.readline() 读一行
f.readlines() 读取所有行(直到结束符 EOF)并返回列表,该列表可以由 Python 的 for... in ... 结构进行处理。如果碰到结束符 EOF 则返回空字符串。
f.writelines() 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
f.tell () 返回文件当前位置
f.seek(x,y) 设置文件当前位置,x表示移动的字节数,y代表模式
f.fluch() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
4.修改文件的两种方式
方式一:1.将文件内容一次性读入内存
2.在内存中修改完毕
3.将新内容写入原文件
1 with open('b.txt',mode='rt',encoding='utf-8') as f1: 2 data = f1.read() 3 res=data.replace("egon",'EGON') 4 5 with open('b.txt', mode='wt', encoding='utf-8') as f2: 6 f2.write(res)
方式二:1.以读的方式打开源文件,以写的方式打开临时文件
2.从源文件中读出一行内容,修改完毕后写入临时文件
3.删除源文件,将临时文件改名为源文件
1 import os 2 3 with open('b.txt',mode='rt',encoding='utf-8') as src_f,\ 4 open('.b.txt.swp',mode='wt',encoding='utf-8') as dst_f: 5 for line in src_f: 6 dst_f.write(line.replace('EGON','egon')) 7 8 os.remove('b.txt') 9 os.rename('.b.txt.swp','b.txt')
修改文件名字和删除文件需要用到OS 模块。
5.文件的实时监视
为了让程序不一直在高速运行,导入了time模块。
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.3) else: print(line.decode('utf-8'),end='')

浙公网安备 33010602011771号