zoukankan      html  css  js  c++  java
  • 06 Python字符编码与文件处理

     

    python垃圾回收机制:

    python中的垃圾回收机制是以引用计数为主,分代收集为辅,引用计数的缺陷是循环引用的问题,一个对象的引用数为0 ,那么这个对象就会被python虚拟机回收内存

    字符编码

    字符编码的介绍

    计算机存放的都是二级制数字,我们输入一个字符,计算机是不认识的,那么就需要一个编码表,吧我们写入的字符转换为二级制数,然后将输入字符对应的二进制数写入内存,再由内存写入硬盘

    在这之间只有一种编码表

    ASCII:只能表示英文字符,用1Bytes对应一个英文字符

    内存:ASCII

    硬盘:ASCII

    GBK:可以表示中文字符和英文字符,用1Bytes表示一个英文字符,用2Bytes表示一个中文字符

    内存:GBK
    硬盘:GBK

    Shift-JIS:
    内存:Shift-JIS
    硬盘:Shift-JIS

    Euc-kr:
    内存:Euc-kr
    硬盘:Euc-kr

    以上是各个国家的字符编码,但是这种字符编码只能在自己的国家使用,所以之后出现了一种统一的字符编码

    unicode:可以对应万国字符,统一用2个Bytes表示一个字符

    两大特点:

      

    1:可以兼容万国字符
    2 与万国字符都有一种数字与数字的对应关系

    人们写入的字符先转码为unicode编码写进内存,再有硬盘里的GBK、EUC-kr或Shift-JIS编码表进行编码之后写进硬盘

    如果要使用,就将字符经过解码,转变为unicode编码,写进内存后再通过unicode编码表一一对应。

    GBK数字-----解码decode----->unicode数字
    Shift-JIS数字-----解码decode----->unicode数字
    
    GBK数字<-----编码encode-----unicode数字
    UTF-8数字<-----编码encode-----unicode数字

    不同的字符编码转换为英文和中文对应的字节数如下

    字符编码    英文    中文

       ASCII    1Bytes    无

      GBK       1Bytes    2Bytes

      Unicode           2Bytes      2Bytes

     Utf-8            1Bytes   3Bytes

    保证不乱码的关键

    当初用什么字符编码存的,取的时候就用什么编码解码

    强调:此时计算机只能使用unicode与字符的对应关系

    在pytohn2中

    1 (执行python程序的第二个阶段)解释器在将py文件当普通的文本文件读入内存时默认使用的编码是ASCII
    2 有两种字符串类型:
      str:x="上" # 文件头指定的编码格式的二进制
      unicode:x=u"上" # 存成unicode格式的二进制

    ps:pyhon2中unicode就是python3的str类型

    在python3中:

    1 (执行python程序的第二个阶段)解释器在将test.py当普通的文本文件读入内存时默认使用的编码是UTF-8
    2 (执行python程序的第三个阶段,开始识别语法),会字符类型的值开辟一个内存空间存入unicode格式的二进制
    ps:python3中的str类型是unicode编码的二进制

    3 字符串类型
      str: x="上" 把‘上’ 存成unicode格式的二进制
      字节串=x.encode('utf-8')

    文件头:
    在文件首行写上:coding:utf-8
    就是在告诉python解释器,不要用其默认的编码,用文件头指定的编码

    文件处理

    1 什么是文件:

    文件就是操作系统为用户/操作系统提供的操作硬盘的抽象单位

    2 为什么要用文件

    实现将内存中的数据永久保存到硬盘中

    3 如何用文件

    文件操作的基本步骤

    f=open(r'a.txt',encoding='utf-8') #打开文件,拿到一个文件对象f,f就相当于一个遥控器,可以向操作系统发送指令
    f.read() # 读写文件,向操作系统发送读写文件指令
    f.close() # 关闭文件,回收操作系统的资源

    强调:一定要在程序结束前关闭打开的文件

    上下文管理:

    with open('文件路径',mode='打开模式',encoding='编码表') as f:   
      pass

    with结束后会自动关闭文件

    4 文件的打开模式

    r:只读模式

    w:只写模式

    a:只追加模式

    5 控制读写文件单位的方式(必须与r/w/a连用)

    t:文本模式(默认的),一定要指定encoding参数

    优点;操作系统会将硬盘中的二进制数字解码城unicode然后返回

    强调::只针对文本文件才会有效

    whit open('a.txt',mode='rt',encoding = 'utf-8' ) as f:
        data = f.read()
        print(data,type(data))
    
    with open('f.png','mode=''rt,encoding = 'utf-8')as f:
        data = f.read()

    二进制模式,一定不能制定encoding参数

    with open('q.png','rb')as f:
        data = f.read()
        print(data,type(data))
    
    
    with open('a.txt',mode = 'rb') as f:
        data = f.read()
        print(data,type(data))
        print(data.decode('utf-8'))

     r: 只读模式L(默认的)

    1当文件不存在是,会报错

    2 当文件存在时,文件指针指向文件的开头

    with open('a.txt',mode='rt',encoding='utf-8') as f:
        res1=f.read()
        print('111===>',res1)
        res2=f.read()
        print('222===>',res2)
    
    with open('a.txt',mode='rt',encoding='utf-8') as f:
        print(f.read())
        print(f.readable())
        print(f.writable())
        print(f.readline())
        print(f.readline())
    
    with open('a.txt',mode='rt',encoding='utf-8') as f:
        for line in f:
            print(line)
    
    with open('a.txt',mode='rt',encoding='utf-8') as f:
        l=[]
        for line in f:
            l.append(line)
            print(l)
            print(f.readlines()        

     w: 只写模式

    1 当文件不存在时,新建一个空文档

    2 当文件存在时,清空文件内容,文件指针跑到文件的开头

    with open('c.txt',mode='wt',encoding='utf-8') as f:
        print(f.readable())
        print(f.writable())
        print(f.read())
    
        f.write('哈哈哈
    ')
        f.write('你愁啥
    ')
        f.write('瞅你咋地
    ')
    
        f.write('1111
    2222
    333
    4444
    ')
    
        info=['egon:123
    ','alex:456
    ','lxx:lxx123
    ']
        for line in info:
            f.write(line)
            f.writelines(info)
    
    with open('c.txt',mode='rb') as f:
        print(f.read())
    
    
    with open('c.txt',mode='wb') as f:
        f.write('哈哈哈
    '.encode('utf-8'))
        f.write('你愁啥
    '.encode('utf-8'))
        f.write('瞅你咋地
    '.encode('utf-8'))

    a: 只追加写模式

     1 当文件不存时,新建一个空文档,文件指针跑到文件的末尾
    2 当文件存在时,文件指针跑到文件的末尾

    with open('c.txt',mode='at',encoding='utf-8') as f:
        print(f.readable())
        print(f.writable())
        f.write('虎老师:123
    ')

    在文件打开不关闭的情况下,连续的写入,下一次写入一定是基于上一次写入指针的位置而继续的

    with open('d.txt',mode='wt',encoding='utf-8') as f:
        f.write('虎老师1:123
    ')
        f.write('虎老师2:123
    ')
        f.write('虎老师3:123
    ')
    
    with open('d.txt',mode='wt',encoding='utf-8') as f:
        f.write('虎老师4:123
    ')
    
    with open('d.txt',mode='at',encoding='utf-8') as f:
        f.write('虎老师1:123
    ')
        f.write('虎老师2:123
    ')
        f.write('虎老师3:123
    ')
    
    with open('d.txt',mode='at',encoding='utf-8') as f:
        f.write('虎老师4:123
    ')
  • 相关阅读:
    2021,6,10 xjzx 模拟考试
    平衡树(二)——Treap
    AtCoder Beginner Contest 204 A-E简要题解
    POJ 2311 Cutting Game 题解
    Codeforces 990G GCD Counting 题解
    NOI2021 SDPTT D2T1 我已经完全理解了 DFS 序线段树 题解
    第三届山东省青少年创意编程与智能设计大赛总结
    Luogu P6042 「ACOI2020」学园祭 题解
    联合省选2021 游记
    Codeforces 1498E Two Houses 题解 —— 如何用结论吊打标算
  • 原文地址:https://www.cnblogs.com/ouyang99-/p/10290113.html
Copyright © 2011-2022 走看看