zoukankan      html  css  js  c++  java
  • 2019-07-05 编码格式和文件操作

    一、字符编码

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

      人在操作计算机的时候输入的是人能看懂的字符,但是计算机只能识别010101这样的二进制数据,那么就需要用字符编码表来处理字符与数字的对应关系。

      最早的是ASCII表,用八位二进制表示一个英文字符,但是它只能表示英文和一些符号,不适合中文。所以中国自己出了一个GBK编码格式,用2Bytes表示一个中文字符。基于上面的推导,每个国家的文字都不一样,那么用的编码格式也不一样,如果要相互使用就很方便。所以出了一个万国码unicode,统一用2Bytes表示所有字符。

      unicode有两个特点:1.因为所有字符都是用2Bytes表示字符,所以会浪费很多存储空间。2.io次数增加,程序运行效率降低(这个是致命的)

      后面针对这两个特点进行修改:当内存中的unicode编码格式数据存在硬盘的时候,会按照utf-8编码。将unicode的英文字符由原来的2Bytes变成1Bytes。将unicode中文字符由原来的2Bytes变成3Bytes。

      现在的计算机:

        内存是unicode

        硬盘是utf-8

      需要掌握的:

        unicode的两个特点:

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

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

        数据由内存存到硬盘:

          1.内存中的unicode格式(我们看的懂得汉字)      >>>通过编码(encode)>>>      硬盘中utf-8格式的二进制数据

          2.硬盘中utf-8格式的二进制数据     >>>通过解码(decode)>>>      内存中unicode格式的(我们看的懂得汉字)       

            decode 用的更多,把二进制数据转化成我们看的懂得

        我们要清楚文件为什么会乱码:因为文件存的格式和读取的格式不一样(******)

    x = ''
    
    #第一种方法:
    # res1 = bytes(x,encoding='utf-8')
    # print(res1,type(res1))
    # res2 = str(res1,encoding='utf-8')
    # print(res2,type(res2))
    
    #第二种方法
    res = x.encode('utf-8')
    print(res)    #b'xe4xb8x8a'
    print(type(res))    #<class 'bytes'>
    print(res.decode('utf-8'))    #

      这里有个python2和python3的不同点:

      python2:将py文件按照文本文件读入解释器默认使用ASCII码

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

    文件头:# coding:utf-8   在py文件开头写这个文件头,编码格式会自动转为这个

    补充:1.pycharm终端使用的是utf-8格式

       2.windows终端采用的是gbk

    字符编码总结:

      我们用代码来举例:

        x = '上'

        res1 = x.encode('utf-8')    #将unicode编码变成可以存储和运输的utf-8的二进制数据

        res2 = res1.decode('utf-8')  #将硬盘中utf-8格式的二进制数据解码成unicode格式的二进制数据

    二、文件操作

        文件处理包括三个步骤:  打开(open) /读写(read,write)/  关闭(close) 

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

        用open打开的文件一定要记得写close关闭

        上面的这种操作方法比较复杂,所以出了文件上下文操作

        with open  的方法,这个用法不用写close,还可以同时打开几个文件。

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

        文件打开模式:

          r  只读模式     默认的模式

          w  只写模式

          a  追加写模式

        操作文件单位的方式:

          t    文本文件    默认的,可以不用写,在操作文本文件的时候,一定要指定encoding参数,如果不添加encoding参数默认是操作系统的默认编码(gbk)

          b   二进制数据文件(比如视频,音频文件)     如果用了这个就不要写encoding参数

        r   只读模式

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

          有三种读取方式:read,readline,readlines

            read:一次性将文件全部读取,返回的数据是字符串格式,缺点是如果文件太大,会占满内存

            readline:读取文件内容的一行,返回的数据也是字符串格式

            readlines:每一行每一行的读,每一行当成一个字符串,所有数据放在一个大列表当中

     
    #读取文本文件用rt
    with open(r'D:Python项目day07a.txt',mode='rt',encoding='utf-8') as f:
         print(f.readable())  # 是否可读
         print(f.writable())  # 是否可写
         print(f.read())  # 一次性将文件内容全部读出
       for i in f: #f可以被for循环 每for循环一次,就读取一行内容
          print(i) #这个方法可以解决一次性读取文件占用内存过大的问题
    #读取二进制文件用rb with open(r'D:Python项目day071.jpeg',mode='rb') as f: print(f.readable()) # 是否可读 print(f.writable()) # 是否可写 print(f.read()) # 一次性将文件内容全部读出 print(f.read()) # 读完一次之后 文件的光标已经在文件末尾了,再读就没有内容了可读 print(f.readlines()) # 返回的是一个列表 列表中的一个个元素对应的就是文件的一行行内容

        w  只写模式(这个模式要慎用,如果文件本身有内容的话,写入的时候会被清空

            1.当文件不存在的时候,会自动创建文件

            2.当文件存在的时候,先清空文件内容,然后再写入

            有三种写入方式:write/writeline/writelines

     with open(r'xxx.txt',mode='w',encoding='utf-8') as f:
         print(f.readable())  # 是否可读
         print(f.writable())  # 是否可写
         f.write('不不不,你没有翻~
    ')
         f.write('不不不,你没有翻~
    ')
         f.write('不不不,你没有翻~
    ')
         f.write('不不不,你没有翻~
    ')
         f.write('不不不,你没有翻~')
    
    
         l = ['不sdffs,sdfs有翻~
    ','不sdfsdf不,你sdfsf翻~
    ','不sfad不,你没sa翻~
    ']
         f.writelines(l)
         # 上下等价
         for i in l:
             f.write(i)

        a      追加模式

          1.在文件不存在的情况下,自动创建文件

          2.当文件存在的情况下,不清空文件内容,文件光标会移动到文件的最后,在原有的基础上追加

        a模式不可读,只能写

    with open(r'yyy.txt',mode='a',encoding='utf-8') as f:
        print(f.readable())  # 是否可读   False
        print(f.writable())  # 是否可写   True
        f.write('我是小尾巴
    ')

    具体的详细内容可以参考:http://note.youdao.com/noteshare?id=17303322fcbc09a85d9bd5195dec25ae&sub=F9D47851E02B4CB7A341119637EC6BAE

  • 相关阅读:
    new、delete和malloc、free
    重写与重载
    面向对象三个基本特征
    Js零散知识点笔记
    ES6 笔记
    js 单例模式笔记
    关于闭包的见解
    DOM笔记
    浏览器差异
    JS高级程序设计 笔记
  • 原文地址:https://www.cnblogs.com/wangcuican/p/11140055.html
Copyright © 2011-2022 走看看