zoukankan      html  css  js  c++  java
  • 7.5字符编码及文件处理

    字符编码

    字符编码针对的是字符文字,也就意味着这里不需要考虑视频、音频等其他文件,字符编码只跟文本文件有关。

    文本编辑器的输入和输出其实是两个过程:

    第一个过程:我们在操作计算机的时候,输入的使是我们能看懂的字符,但是计算机看不懂,计算机只能识别10100这样的二进制电讯号,那么我们输入的字符就会被*转换*成二进制数字。

    这里转换需要用到的工具就是字符编码表:

    1.ASCII码表

    这是最早的字符编码表,美国人发明,它用八位二进制表示一个英文字符,比如0000 0000, 1111 1111,最大也就是1111 1111,所有的英文字符+符号最多也就125位左右

    一位二进制 =1bit,8bit = 1Bytes

    2.GBK

    中国人发明的字符编码表,用2Bytes表示一个中文字符,还是用1Bytes表示一个英文字符,1111 1111 1111 1111所以最多能表示65535个字符(中华文化博大精深)

    3.日本:Shift_JIS   韩国:EUC-KR ......

    综上所述,任何一个国家要想让计算机支持本国语言都必须自己创建一个字符与数字的对应关系,也就是字符编码表

    4.Unicode:万国码

    这个时候迫切需要一个世界的标准(能包含全世界的语言)的字符编码表,于是Unicode应运而生,统一用2Bytes表示所有的字符。

    优点:

    1.用户在输入的时候,无论输什么字符都能够被万国码识别

    2.其他国家编码的数据由硬盘读到内存的时候,unicode与其他各个国家的编码都有对应关系

    缺点:

    这时候乱码问题消失了,所有的文档我们都能使用,但是新问题出现了,如果我们的文档通篇都是英文,你用unicode会比ascii耗费多一倍的空间,在存储和传输上十分的低效。所以又出现了UTF-8

    5.UTF-8

    它会将unicode的英文字符由原来的2Bytes变成1Bytes,将unicode中文字符由原来的2Bytes变成3Bytes

    6.必须掌握的知识:

    现在的计算机

      内存都是Unicode

      硬盘都是UTF-8

    1.数据由内存保存到硬盘

    过程:内存中的unicode格式二进制数字     >>>>>编码(encode)>>>>>     utf-8格式的二进制数据

    2.硬盘中的数据由硬盘读到内存

    过程:硬盘中的utf-8格式的二进制数据       >>>>>解码(decode)>>>>>     内存中unicode格式的二进制数据

    3.保证不出现乱码在于

    文本文件以什么编码编的就以什么编码解!

    7.文件头

    在python2中

      将py文件按照文本文件读入解释器中默认使用ASCII码(因为在开发python2解释器的unicode还没有盛行)

    在python3中

      将py文件按照文本文件读入解释器中默认使用utf-8

    coding:

    为了python解释器不出现解码问题,.py文件都需要添加一个文件头,比如:coding:utf-8  

    为的就是将python解释器中的数据按照文件头的编码格式存储数据(比如python2中当你不指定文件头的时候,默认用ASCII存储数据,如果指定文件头那么就按照文件头的编码格式存储数据,python3中的数据默认是unicode编码格式的二进制数)

    补充:

    pycharm终端用的是utf-8,windows终端用的是gbk

    8.endcode和decode

    x = ''
    res1 = x.encode('utf-8')  # 将unicode编码成可以存储和传输的utf-8的二进制数据
    print(res1)  # b'xe4xb8x8a'    b代表bytes类型  字节串类型  你就把它当成二进制数据即可
    res2 = res1.decode('utf-8')  # 将硬盘中的utf-8格式的二进制数据解码成unicode格式的二进制数据
    print(res2)

    文件处理

    1.什么是文件?

    操作系统提供给用户操作复杂硬件(硬盘)的简易的接口

    2.为什么操作文件?

    人或者应用程序需要永久的保存数据

    3.如何用?

    with open(r'F:pythonday07代码day07a.txt',encoding='utf-8') as f,
            open(r'F:pythonday07代码day07.txt',encoding='utf-8') as f1:
    # f仅仅是一个变量名,你把它看成是一个遥控器,r作用是取消转义,后面是要打开的文件的路径,encoding=代表用什么格式解码这个文件
        print(f)
        print(f.read())  # 读取文件内容
        print(f1)
        print(f1.read())  # 读取文件内容

    4.文件打开的模式

    操作文件单位的方式

      t 文本文件 t在使用的时候需要指定encoding参数 如果不知道默认是操作系统的默认编码

      b 二进制 一定不能指定encoding参数

    1. r :只读模式

    with open(r'F:pythonday07代码day07a.txt',mode='rt',encoding='utf-8') as f:
        print(f.readable())  # 是否可读
        print(f.writable())  # 是否可写
        print(">>>1:")
        print(f.read())  # 一次性将文件内容全部读出
        print('>>>2:')
        print(f.read())  # 读完一次之后 文件的光标已经在文件末尾了,再读就没有内容可读了
    # mode参数可以不写,不写的话默认是rt,只读文本文件,后面需要带解码格式

    如果是个图片格式

    with open(r'F:pythonday07代码day071.jpeg','rb') as f:  # mode关键字可以不写
        print(f.readable())  # 是否可读
        print(f.writable())  # 是否可写
        print(f.read())  # 一次性将文件内容全部读出
    # mode参数还可以写rb,可以读图片等其他类型,读出来的是进制模式,一定不能指定encoding参数

    redline和redlines

    with open(r'F:pythonday07代码day07a.txt',encoding='utf-8') as f:  # mode关键字可以不写
        print(f.readable())  # 是否可读
        print(f.writable())  # 是否可写
        print(f.readline())  # 只读取文件一行内容
        print(f.readlines())  # 返回的是一个列表  列表中的一个个元素对应的就是文件的一行行内容
        for i in f:  # f可以被for循环 每for循环依次 读一行内容
            print(i)  # 这个方法 就可以解决大文件一次性读取占用内存过高的问题

    r模式在打开文件的时候 如果文件不存在,直接报错

    文件路径可以写相对路径,但是需要注意该文件必须与执行文件在同一层文件下

    2. w :只写模式,一定要慎用

    (1)当文件不存在的情况下,自动创建该文件

    (2)当文件存在的情况下,会先清空文件内容再写入

    with open(r'F:pythonday07代码day07c.txt','w',encoding='utf-8') as f:  # mode关键字可以不写
        print(f.readable())  # 是否可读
        print(f.writable())  # 是否可写
        f.write('第一行
    ')
        f.write('第二行
    ')

    (3)writelines

    with open(r'F:pythonday07代码day07c.txt','w',encoding='utf-8') as f:  # mode关键字可以不写
        l = ['第一行
    ','第二行
    ','第三行
    ']
        f.writelines(l)

    相当于

    with open(r'F:pythonday07代码day07c.txt','w',encoding='utf-8') as f:  # mode关键字可以不写
        l = ['第一行
    ','第二行
    ','第三行
    ']
        for i in l:
            f.write(i)

    3. a :追加写模式

    (1)当文件不存在的情况下,自动创建该文件

    (2)当文件存在的情况下,不清空文件内容, 文件的光标会移动文件的最后

    with open(r'F:pythonday07代码day07c.txt','a',encoding='utf-8') as f:  # mode关键字可以不写
        print(f.readable())  # 是否可读
        print(f.writable())  # 是否可写
        f.write('第四行
    ')
  • 相关阅读:
    UOJ#310. 【UNR #2】黎明前的巧克力(FWT)
    cf24D. Broken robot(高斯消元)
    loj#2483. 「CEOI2017」Building Bridges(dp cdq 凸包)
    给博客园加一个会动的小人-spig.js
    loj#6033. 「雅礼集训 2017 Day2」棋盘游戏(二分图博弈)
    loj#6032. 「雅礼集训 2017 Day2」水箱(并查集 贪心 扫描线)
    洛谷P4103 [HEOI2014]大工程(虚树 树形dp)
    Oracle DB SQL 性能分析器
    ORA-000845 与 /dev/shm(tempfs)
    ID3DXMesh接口 创建自己的立方体网格
  • 原文地址:https://www.cnblogs.com/francis1/p/11140999.html
Copyright © 2011-2022 走看看