python day07 字符编码、文件处理高级

day07 字符编码、文件处理高级

1、字符编码(*****)

  1. 字符编码

    编码:字符编码表

    字符——————————>>>数字

    解码:字符编码表

    字符<<<——————————数字

  2. 字符编码表

    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、保证不乱码:

  1. 首先保证存的时候不乱码如何保证

    往内存时不用管,计算机默认内存unicode

    往硬盘存的时候得以utf-8的形式

  2. 编码与解码用的是同一张字符编码表

2、如何保证取得时候不乱码:

编码与解码用的是同一张字符编码表

python3解释器默认读文件的编码格式是utf-8

python2解释器默认读文件的编码格式是ascii

 

2、文件处理高级部分

  1. 文件处理的其他方法

    with open('a.txt','w',encoding='utf-8') as f:
       names = ['egon', 'tom', 'lili']
       f.writelines(names)  # 遍历names每遍历一个写一次
       f.write('aah')
       f.flush()  # 保证数据的几时率但会牺牲性能

     

  2. 控制文件指针移动

    控制文件内指针移动的单位:只有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模式打开文件

  3. 文件修改的两种方式

    方式一:
    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')

     

     

  4. 日志检测

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

posted @ 2021-03-30 14:30  橘丶阳菜  阅读(41)  评论(0编辑  收藏  举报