zoukankan      html  css  js  c++  java
  • python基础(五)-字符编码与文件

    今日内容

    字符编码:

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

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

    • 人在操作计算机的时候输入的是人能够看懂的字符,但是计算机只能识别01010101这样的二进制数据
    • 那么人 输入的字符 >>>(字符编码表)>>> 二进制数字

    字符编码表就是字符与数字的对应关系

    • ASCII码表:用八位二进制表示一个英文字符,且所有的英文字符+符号最多也就在125位左右

      0000 0000

      1111 1111

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

      0000 0000 0000 0000

      1111 1111 1111 1111 (最多能表示65535个字符)

    基于上面的推导步骤,任何一个国家要想让计算机支持本国语言,都必须自己创建一个字符编码表。

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

      a = 0000 0000 0010 1010

        1.浪费存储空间

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

    当内存中的unicode( unicode transformation format )编码格式的数据存到硬盘时,会按照UTF-8编码给你转换。

    • UTF-8会将unicode的英文字符由原来的2Bytes变成1Bytes
    • UTF-8会将中文字符由原来的2Bytes变成3Bytes

    现今的计算机:内存都是unicode、硬盘都是UTF-8

    (需要掌握的)

    unicode的两个特点

    • 1.用户在输入的时候,无论输入什么字符都能兼容万国字符
    • 2.其他国家编码的数据由硬盘读到内存的时候,unicode与其他各个国家的编码都有对应关系

    (必须掌握的)

    数据由内存保存到硬盘

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

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

    1.硬盘中的UTF-8格式的二进制数据 >>>解码(decode)>>> 内存中unicode格式的二进制数据

     

    乱码:字符不能够正常显示,因为编码不一致

    • 保证不乱码的关键在于:
    • 文本文件以什么编码编的就用什么编码解!!!

    python2

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

    python3

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

     

    文件头:

    # coding:UTF-8

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

     基于Python解释器开发的软件,只要是中文,前面都需要加一个u,为的就是将python2(当你不指定文件头的时候,默认用ASCII码存储数据,如果指定文件头就按照指定的编码格式存储)存储为unicode编码文件。

    python3中字符串默认就是unicode格式

    补充:

    1.pycharm终端用的是UTF-8格式

    2.windows终端cmd用的是GBK格式

    八位二进制也叫8bit

    8bit = 1Bytes

    1024Bytes = 1KB

    1024KB = 1MB

    1024MB = 1GB

    1024GB = 1TB

    1024TB = 1PB

    ......

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

    例如:你a他

    1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes

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

    其中1Bytes里由标识符显示如何分配的信息

     

    文件处理:

    什么是文件?

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

    为什么要操作文件?

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

    如何进行文件处理?

     通过python代码操作文件:

    f = open(r‘copy_path即可’)  #向操作系统发送请求,打开某个文件 
    
    # 里面的r是real取消转义,指的是原先的字符串
    
    # 应用程序要想操作计算机硬件,必须通过操作系统来间接的操作
    
    print(f)  # f是文件对象 
    
    print(f.read())  #报错,因为windows操作系统默认的编码是GBK
    
    f = open(r‘copy_path即可’,encoding=‘utf-8’)
    
    print(f.read())
    
    f.read()  #向操作系统发请求,读取文件内容
    
    f.close()  #向操作系统发送请求,关闭打开的文件
    
    print(f.read())  #报错,显示I/O operation on closed file

     文件上下文操作:

    with open(r’copy_path’,encoding=‘utf-8’) as f ,
    
    open(r’copy_path’,encoding=‘utf-8’) as f1:
    
    # f仅仅是个变量名,它只是个操作工具
    
    print(f)
    
    print(f.read())
    
    print(f1)
    
    print(f1.read())

     文件打开模式:

    • r 只读模式
    • w 只写模式
    • a 追加写模式

     操作文件单位的方式:

    • t 文本文件,t在使用时需要指定encoding参数,如果不指定就默认是操作系统的默认编码
    • b 二进制,一定不能指定encoding参数

    r模式

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

    W模式

    • 1.文件不存在的情况下,自动创建该文件
    • 2.当文件存在的情况下,会先清空文件内容再写入
    with open(r’copy_path’,‘w’,encoding=‘utf-8’) as f:
    
    print(f.readable())  # False,是否可读
    
    print(f.writeable())  # True,是否可写
    
    f.write(‘今天XXXXX
    ’)  # 用
    会换行两次
    
    f.write(‘今天XXXXX
    ’)  # 用
    或者
    只会换行一次
    
    l = [‘XXX,XXX
    ’,‘XXX,XXX
    ’]
    
    f.writelines()  # 可以写多行,上下文等价
    
    for i in l:
    
    f.write(i)

    A 模式

    • 1.当文件不存在的情况下,自动创建一个文件
    • 2.当文件存在的情况下,不清空文件内容,文件的光标会移动到文件的最后
    with open(r’copy_path’,‘a’,encoding=‘utf-8’) as f:
    
    print(f.readable())  # False,是否可读
    
    print(f.writeable())  # True,是否可写
    
    f.write(‘XXXXX
    ’)

     

  • 相关阅读:
    调试与分析
    GCC
    汇编
    数据恢复
    TCP/IP
    shell
    vmstat、top
    计算程序运行时间的封装
    protobuf
    c++模板
  • 原文地址:https://www.cnblogs.com/zhukaijian/p/11139300.html
Copyright © 2011-2022 走看看