• 字符编码和文件处理


      """
    1.运行程序的三个核心硬件
    cpu
    内存
    硬盘

    任何一个程序要想运算,必选先有硬盘加载到内存,然后cpu去内存取指执行
    运行着的应用程序产生的数据 必先存在内存

    2.python解释器运行一个py文件(xxx.py)步骤
    1.将python解释器的代码由硬盘读到内存
    2.将xxx.py以普通文本文件形式读到内存
    3.python读取文件内容 识别python语法 执行相应操作
    ps:普通的文本编辑器与python解释器前两步都是一样的

    """
    一、字符编码:
     
     
    1.字符编码针对的是文字,也就意味只和文本文件有关,和视频、音频文件无关。
      
      2、文本编辑器的输入和输出是两个过程。

        人在操作计算机的时候输入的是人能够看懂的字符,
    但是计算机只能识别010101这样的二进制数据,
        那么输入的字符   >>>(字符编码表)>>>   二进制数字
      
      3、字符编码表就是字符与数字的对应关系

      
      4、

         ASCII码表  用八位二进制表示一个英文字符 所有的英文字符+符号最多也就在125位左右
         GBK     用2Bytes表示一个中文字符 还是用1Bytes表示一个英文字符  最多能表示65535个字符
         万国码unicode 统一用2Bytes表示所有的字符
         缺点:1.浪费存储空间;2.io次数增减,程序运行效率降低(致命)
      
      5、当内存中的unicode编码格式数据存到硬盘的时候,会按照utf-8编码(unicode transformation format)

        unicode的两个特点 (需要掌握)
          1、用户在输入的时候,无论输什么字符都能够兼容万国字符
          2、其他国家编码的数据由硬盘读到内存的时候unicode与其他各个国家的编码都有对应关系
         数据由内存保存到硬盘(必须掌握)
          内存中的unicode格式二进制数字 >>>编码(encode)>>>  utf-8格式的二进制数据    
         硬盘中的数据由硬盘读到内存  >>>解码(decode)>>>   内存中unicode格式的二进制数据
       ps:保证不乱码在于  >>>  文本文件以什么编码编的就以什么编码解   
          python2 解释器默认使用ASCII码
          python3 解释器默认使用utf-8
        
    6、文件名

          # coding:utf-8
            1、因为所有编码都支持英文字符,所以文件头才能正常生效
          给予python解释器开发的软件,只要是中文,前面都需要加一个u,
          为了的就是讲Python2(当你不指定文件头的时候,默认ASCII存储数据,如果指定文件头那么就按照文件头的编码格式存储数据)

          python3中字符串默认就是unicode编码的二进制数
        补充:
           1、pycharm终端用的是utf-8格式
           2、Windows终端采用的是GBK
        ps:乱码的原因:字符不能够正常显示,多数编码不一致。
          八位二进制也叫8bit(******)       8bit = 1Bytes       1024Bytes = 1KB       1024KB = 1MB       1024MB = 1GB       1024GB = 1TB       1024TB = 1PB       ....
      重点:
        字符编码表总结
    x = ''
    res1 = x.encode('gbk')  # 将unicode编码成可以存储和传输的utf-8的二进制数据
    print(res1)  # b'\xe4\xb8\x8a'
    # bytes类型  字节串类型  你就把它当成二进制数据即可
    res2 = res1.decode('gbk')  # 将硬盘中的utf-8格式的二进制数据解码成unicode格式的二进制数据
    print(res2)   
    # 第一种转换方式
    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(type(res))
    print(res.decode('utf-8'))

    二、文件处理:

      1、什么是文件?

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

      2、为什么操作文件

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

      ps:python代码操作文件

        f = open(文件路径,mode='读写模式' , encoding='utf-8')

        f.close()

        print(f)

        f:遥控器     文件句柄

      3、如何用?

        f = open()

        f.read()

        f.close()

    '''
    通过python代码操作文件
     r 取消转义
     f = open(r'文件路径',encoding='utf-8')  # 向操作系统发送请求  打开某个文件
    # # 应用程序要想操作计算机硬件 必须通过操作系统来简介的操作
    print(f)  # f是文件对象
    print(f.read())  # windows操作系统默认的编码是gbk
    f.read()  # 向操作系统发请求 读取文件内容
    f.close()  # 告诉操作系统 关闭打开的文件
    print(f)
    print(f.read())
    '''
    # 文件上下文操作
    with open(r'文件路径',encoding='utf-8') as f ,\
            open(r'文件路径,encoding='utf-8') as f1:  # f仅仅是一个变量名 你把它看成是一个遥控器
        print(f)
        print(f.read())
        print(f1)
        print(f1.read())

      4、

      4.1、文件的上下文管理

          with open(....) as f:        

        文件操作文件路径:

          相对路径:必须有一个参照物 通常是相对于执行文件所在的文件夹

          绝对路径:类似于GPS全球定位,不需要有任何的参照物

        r用来取消转义:

          r'D:av\ttt\xxx\ooo\rrr'

        mode不写默认用的是rt  (下文操作方式有写)

        encoding参数只在mode位文本模式的情况下才加

      4.2、文件打开的模式:

        r 只读模式:

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

        w 只写模式:

           w模式一定要慎用

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

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

        a 追加模式:

          1.当文件不存在的情况下 自动创建该文件。

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

      5、操作文件单位的方式

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

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

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

       例如: 
    with open(r'文件索引',mode='r',encoding='utf-8') as f:
            print(f.readable())  # 是否可读
            print(f.writable())  # 是否可写
            print(f.read())  # 一次性将文件内容全部读出
        
            print(f.readlines())  # 返回的是一个列表  列表中的一个个元素对应的就是文件的一行行内容
            for line in f:  # f 可以被for循环 每for循环依次 读一行内容
            print(line)  # 这个方法 就可以解决大文件一次性读取占用内存过高的问题
            print(f.readline())  # 只读取文件一行内容                  

       6、文件内光标移动:

        ps:在rt模式下,read内的数字,表示的是字符的个数,除此之外,数字表示的都是字节。

        1、f.seek(offset,whence)
          offset:相对偏移量 光标移动的位数
          whence:
            0:参照文件的开头,t和b都可以使用
            1:参照光标所在的当前位置,只能在b模式下使用
            2:参照文件的末尾,只能在b模式下使用 ps:(-5,2)表示倒着读5个Bytes
    with open(r'test','rt',encoding='utf-8') as f:
        print(f.read(1))
        f.seek(6,0)  # seek移动都是字节数 表示6个字节
        f.seek(3,0)  # seek移动都是字节数 从头开始读3个字节
        print(f.read(1))    # 往后读一位文本字符

            ps:换行占2个字节(Bytes);

         2、f.truncate()  截断文件内容     # 接受的字节的长度,整型。

    with open(r'test','a',encoding='utf-8') as f:
        f.truncate(6)  
        # 保留0~6字节数 后面的全部删除(截断)

         3.检测文件是否被修改

          打开文件,利用f.seek(0,2)将光标移动到文件末尾

          利用while循环

            再利用readline()来读取末尾内容

            通过if判断看readline()是否有值 ,有值说明文件新增了内容

            通过字符串的格式化输出将新增的文件内容输出给检测程序

          ps:  查看当前光标移动了多少字节            f.tell()

            将内存中的文件内容直接刷到硬盘          f.flush()

          

          





  • 相关阅读:
    权限框架之Shiro详解(非原创)
    MySQL数据库基础详解(非原创)
    ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第十四天(非原创)
    ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第十三天(非原创)
    nginx配置location与rewrite规则教程
    CentOS7安装MySQL 5.7
    MySQL 5.6 解决InnoDB: Error: Table "mysql"."innodb_table_stats" not found.问题
    公文流转系统(未完成)
    对java异常的总结及java项目中的常用的异常处理情况
    课堂动手动脑验证以及自定义异常类实现对异常处理——java异常类
  • 原文地址:https://www.cnblogs.com/xiaowangba9494/p/11139653.html
Copyright © 2020-2023  润新知