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
    ')
  • 相关阅读:
    想不明白为什么不复用老接口?
    dubbo入门教程-从零搭建dubbo服务
    使用Node.js时如何引入jQuery
    博客园在我的博客添加点击小心心特效
    博客园在微信内置浏览器打开时添加微信赞赏码功能
    Keepalived
    双网卡服务器使用指定网卡互通不同网段数据
    LNMP详解
    Centos7数据实时同步(Rsync+inotify)
    解决Centos7本机时间与实际时间相差8小时
  • 原文地址:https://www.cnblogs.com/ouyang99-/p/10290113.html
Copyright © 2011-2022 走看看