字符编码和文件处理

字符编码和文件处理

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='')

 

posted @ 2021-03-24 17:09  余鑫  阅读(68)  评论(0)    收藏  举报