字符编码与文件操作

一、字符编码

  1.回顾:

    (1)运行程序的三个核心硬件:

      cpu、内存、硬盘

      任何一个程序想要运行,必须先有硬盘加载到内存取值执行

      运行着应用程序产生的数据,必先存在内存

    (2)python解释器运行一个py文件(x.py)步骤

      1.将python解释器的代码由硬盘读到内存

      2.将x.py以普通文本文件形式读到内存

      3.python读取文件内容,识别python语法,执行相应操作

      ps:普通的文本编辑器与python解释器前两步都是一样的

  2.字符编码

    (1)字符编码针对的是文字,不需要考虑视频文件、音频文件等,只跟文本文件有关

    (2)文本编辑器的输入和输出是两个过程

    (3)人与计算机之间的交互:

      输入的字符>>>(字符编码表)>>>二进制数字

    (4)字符编码表:字符与数字的对应关系

      ASCII码表:用八位二进制表示一个英文字符

        所有的英文字符+符号最多也就是在125位左右

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

        最多能表示65535个字符  

      shift和fuck分别是日本和韩国字符编码表

      万国码unicode:统一用2Bytes表示所有的字符

        缺点:

          1.浪费存储空间

          2.io次数增加,程序运行效率降低(致命)

        特点:

          1.用户在输入的时候,无论输什么字符都能够兼容万国字符

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

      utf-8:当内存中的unicode编码格式数据存到硬盘的时候,会按照utf-8编码

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

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

    (5)计算机:内存是unicode,硬盘是utf-8

    (6)数据由内存保存到硬盘:

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

         硬盘中的数据由硬盘读到内存:

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

    (7)乱码:字符不能够正常显示

      保证不乱码在于:文本文件以什么编码编的就以什么编码解

    (8)八位二进制也叫8bit

      8bit = 1Bytes

      1024Bytes = 1KB

      1024KB = 1MB

      1024MB = 1GB

      1024GB = 1TB

      1024TB = 1PB

    ps:

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

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

    文件头使用coding:utf-8

    原因:因为所有的编码都支持英文字符,所以文件头才能够正常生效

    基于Python解释器开发的软件,只要是中文,前面都需要加一个u

    为了的就是讲python2(当你不指定文件头的时候,默认用ABCII存储数据,如果指定文件头那么就按照文件头的编码格式存储数据)

    python3中字符串默认就是unicode编码格式的二进制

    pycharm终端用的是utf-8格式

    windows终端采用的是gbk格式

  总结:将unicode编码成可以存储和传输的utf-8的二进制数据

x = ''
res1 = x.encode('gbk')  # 将unicode编码成可以存储和传输的utf-8的二进制数据
print(res1)  # b'\xe4\xb8\x8a'

  将硬盘中的utf-8格式的二进制数据解码成unicode格式的二进制数据

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

  补充:

1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes
1+7bit|1+7bit|1+7bit|1+7bit|1+7bit|1+7bit|1+7bit

二、文件操作

  1.什么是文件?

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

  2.为什么操作文件?

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

  3.如何用?

    f = open()  向操作系统发送请求,打开某个文件

    f.read()  向操作系统发请求,读取文件内容

    f.close()  告诉操作系统,关闭打开的文件

# 通过python代码操作文件
# r取消转义
f = open(r'D:\Python项目\day07\a.txt',encoding='utf-8')  # 向操作系统发送请求  打开某个文件
# 应用程序要想操作计算机硬件 必须通过操作系统来间接的操作硬件
print(f)  # f是文件对象
print(f.read())  # windows操作系统默认的编码是gbk
print(f)
print(f.read())

  4.文件上下操作

with open(r'D:\Python项目\day07\a.txt',encoding='utf-8') as f ,\
        open(r'D:\Python项目\day07\b.txt',encoding='utf-8') as f1:  # f仅仅是一个变量名 你把它看成是一个遥控器
    print(f)
    print(f.read())
    print(f1)
    print(f1.read())

  5.文件打开的模式:

    mode参数 可以不写  不写的话默认是rt 只读的文本文件  这个t不写默认就是t

    r 只读模式

# r模式在打开文件的时候 如果文件不存在 直接报错
# 文件路径可以写相对路径 但是需要注意该文件必须与执行文件在同一层文件下
with open(r'a.txt',mode='r',encoding='utf-8') as f:
    with open(r'a.txt','r',encoding='utf-8') as f1:  # mode关键字可以不写
        print(f.readable())  # 是否可读
        print(f.writable())  # 是否可写
        print(">>>1:")
        print(f.read())  # 一次性将文件内容全部读出
        print('>>>2:')
        print(f.read())  # 读完一次之后 文件的光标已经在文件末尾了,再读就没有内容了可读
        print(f.readlines())  # 返回的是一个列表  列表中的一个个元素对应的就是文件的一行行内容
        for line in f:  # f可以被for循环 每for循环依次 读一行内容
            print(line)  # 这个方法 就可以解决大文件一次性读取占用内存过高的问题
        print(f.readline())  # 只读取文件一行内容

    w 只写模式

# w模式:w模式一定要慎用
# 1.文件不存在的情况下 自动创建该文件
# 2.当文件存在的情况下 会先清空文件内容再写入
with open(r'xxx.txt',mode='w',encoding='utf-8') as f:
    print(f.readable())  # 是否可读
    print(f.writable())  # 是否可写
    f.write('不不不,你没有翻~\n')
    f.write('不不不,你没有翻~\r')
    f.write('不不不,你没有翻~')
    l = ['不sdffs,sdfs有翻~\n','不sdfsdf不,你sdfsf翻~\n','不sfad不,你没sa翻~\n']
    f.writelines(l)
    # # 上下等价
    for i in l:
        f.write(i)

    a 追加写模式

# a模式
# 1.当文件不存在的情况下 自动创建该文件
# 2.当文件存在的情况下,不清空文件内容, 文件的光标会移动文件的最后
with open(r'yyy.txt',mode='a',encoding='utf-8') as f:
    print(f.readable())  # 是否可读
    print(f.writable())  # 是否可写
    f.write('我是小尾巴\n')

 

posted @ 2019-07-05 19:09  静心学  阅读(176)  评论(0)    收藏  举报