• 05 python开发之文件处理


    05 python开发之文件处理

    5 文件处理

    5.1 字符编码

    5.1.1 基本概念

    • 字符编码

      文字符号-----------------编码----------------->数字

      文字符号<----------------编码------------------数字

    • 字符编码表:一个字符对应一个数字

    • 研究字符编码表是为了解决乱码问题

      存取都用同一张字符编码表

    • 储备知识:CPU、内存、硬盘

    • 运行python程序的三个阶段

      Ⅰ 先启动一个python解释器
      Ⅱ python解释器会将文件内容从硬盘读入内存
      Ⅲ python解释器会解释执行刚刚读入内存的代码,识别语法
      x = "你好Hello"

    5.1.2 发展历程

    • 一家独大

      ASCⅡ:只能识别英文字符,用8个bit对应一个英文字符

    • 天下大乱

      GBK:能识别中文和英文,用16个bit(2Bytes)对应一个字符

      shift-JIS

      Euc-KR

    • 归于统一

      unicode:能识别万国字符,常用16bit(2Bytes)对应一个字符

    5.1.3 使用

    • part1

    ​ 英文字符------->内存(ASCⅡ格式的二进制数)---->硬盘(ASCⅡ格式的二进制数)

    中文、英文字符------->内存(GBK格式的二进制数)----->硬盘(GBK格式的二进制数)

    日文、英文字符--->内存(shift-JIS格式的二进制数)--->硬盘(shift-JIS格式的二进制数)

    ​ 万国字符----->内存(Unicode格式的二进制数)---->硬盘(utf-8格式的二进制数)

    • part2
    字符-------->unicode格式的二进制(内存)---------------->utf-8格式的二进制(硬盘)
          编码                              编码
    字符<--------unicode格式的二进制(内存)<----------------utf-8格式的二进制(硬盘)
          解码                              解码
    
    x = "上"
    print(x)  # 打印unicode相当于打印字符
    
    utf8_res = x.encode("utf-8")
    # print(utf8_res, type(utf8_res))  # b'xe4xb8x8a' <class 'bytes'>
    unicode_res = utf8_res.decode("utf-8")
    print(unicode_res)
    

    5.2 文件处理基础

    5.2.1 基本概念

    • 文件是操作系统提供给用户/应用程序存取硬盘的一种机制

    • 文件可以永久保存数据

    • 如何使用文件

      应用程序 open()

      操作系统 文件

      计算机硬件(硬盘)

    5.2.2 操作文件的步骤

    • rawstring原生路径

      f = open(r'文件绝对路径/相对路径')

      f的值,文件对象/文件句柄

    • data = f.read()

      print(data)

    • f.close() # 回收系统资源

    5.2.3 with上下文管理

    with open(r'绝对路径或相对路径') as f1,
      open(r'绝对路径或相对路径') as f2:
        f1.read()
        f2.read()
    
    with open(r'第二周计划', "rt", encoding='utf-8') as f1:
        data = f1.read()
        print(data)
        f1.close()
        data = f1.read()
        print(data)
    

    5.3 文件打开模式

    5.3.1 控制读写操作模式

    • r : 只读(默认)
    • w : 只写
    • a : 只追加写

    5.3.2 控制读写内容的模式

    • t : 读写都是文本格式,即读写都是用字符串(默认)
    • b : 读写都是bytes格式,bytes等同于二进制

    强调:如果是t模式,一定要加上encoding="编码格式"

    ​ 如果是b模式,一定不可以加上encoding="编码格式"

    5.3.3 常规使用

    • r:在文件存在的时候,文件指针调到文件的开头,文件不存在直接报错
    r:在文件存在的时候,文件指针调到文件的开头,文件不存在直接报错
    f = open("a.txt", mode="rt", encoding="utf-8")
    res = f.read()
    print(res)
    f.close()
    
    • w:在文件存在的时候会清空文件,指针调到文件开头,文件不存在会创建空新文件
    w:在文件存在的时候会清空文件,指针调到文件开头,文件不存在会创建空新文件
    f = open("a.txt", mode="wt", encoding="utf-8")
    f.write("你好
    666")
    f.close()
    
    • a:在文件存在的时候不会清空文件,指针跳到文件末尾,文件不存在会创建空新文件
    a:在文件存在的时候不会清空文件,指针跳到文件末尾,文件不存在会创建空新文件
    f = open("a.txt", mode="at", encoding="utf-8")
    f.write("
    777")
    f.close()
    
    • rb wb ab
    rb wb ab
    f = open("a.txt", mode="rb")
    res = f.read()
    print(res)
    print(res.decode("utf-8"))
    f.close()
    
    f = open("a.txt", mode="wb")
    f.write("你好".encode('utf-8'))
    f.close()
    
    • 图片、视频等非文本文件只能用b模式
    with open(r'H:BaiduNetdiskDownloadLinux阶段总结imgday004主板.png', mode='rb') as f1,
      open(r'C:Users曹嘉鑫Desktop1111.png', mode='wb') as f2:
        # res = f1.read()
        # f2.write(res)
        for line in f1:
            f2.write(line)
    

    5.3.4 拓展功能

    with open('a.txt', mode='r+t', encoding='utf-8') as f:
        print(f.read())
        print(f.writable())
        print(f.readable())
        f.write("你好")
    
    with open('a.txt', mode='w+t', encoding='utf-8') as f:
        print(f.writable())
        print(f.readable())
        f.write("你好")
        res = f.read()
        print("===> %s" % res)
    
    with open('a.txt', mode='a+t', encoding='utf-8') as f:
        print(f.writable())
        print(f.readable())
        print(f.read())
    
    f.flush()
    print(f.name)
    print(f.encoding)
    

    5.4 文件处理的其他办法

    5.4.1 读操作

    with open('a.txt', mode='rt', encoding='utf-8') as f:
        line1 = f.readline()
        print(line1)
        line2 = f.readline()
        print(line2)
    
        for line in f:
            print(line)
    
        lines = f.readlines()
        print(lines)
    

    5.4.2 写操作

    with open('a.txt', mode='wt', encoding='utf-8') as f:
        f.write("1111
    2222
    3333
    ")
    
        for x in "hello":
            f.write(x)
    
        f.writelines("hello")  # f.write("hello")
    
        f.writelines(["111", "222", "333"])
        f.writelines(["111
    ", "222
    ", "333
    "])
    

    5.5 控制指针移动

    5.5.1 重要概念

    • 文件内指针移动,除了t模式下的read(n)中n代表的是字符个数
    • 其他都是以bytes为单位的
    with open('a.txt', mode='rt', encoding='utf-8') as f:
        res = f.read(6)
        print(res)
    
    with open('a.txt', mode='rb') as f:
        res = f.read(8)
        print(res)
        print(res.decode('utf-8'))
    
    with open('a.txt', mode='r+', encoding='utf-8') as f:
        f.truncate(8)
    

    5.5.2 f.seek()

    • f.seek(移动的字节个数,模式)

    • 三种模式

      0 : 参照文件开头移动指针

      1 : 参照当前所在的位置移动指针

      2 : 参照文件末尾位置移动指针

    • 只有0模式可以在t下使用

    • 1和2只能在b下使用

    只有0模式可以在t下使用,1和2只能在b下使用
    with open('a.txt', mode='a+b') as f:
        print(f.tell())         # 查看指针在文件的第几个字节
    
    with open('a.txt', mode='r+b') as f:
        f.seek(0, 2)
        print(f.tell())
    
    with open('a.txt', mode='a+b') as f:
        f.seek(-6, 2)
        # print(f.read().decode('utf-8'))
        print(f.read(3).decode('utf-8'))
    
    
    import time
    
    with open('a.txt', mode='rb') as f:
        f.seek(0, 2)
        while True:
            line = f.readline()
            if len(line) == 0:
                time.sleep(0.1)
            else:
                print(line.decode('utf-8'), end="")
    

    5.6 文件修改的两种方式

    # 方式一:
    # 1、以r模式打开源文件,将源文件内容全部读入内存
    # 2、在内存中修改完毕
    # 3、以w模式打开源文件,将修改后的内容写入源文件
    # 优点:不必大量占用硬盘资源
    # 缺点:耗内存,需要足够的内存空间
    
    with open('a.txt', mode='rt', encoding='utf-8') as f1:
        data = f1.read()
        res = data.replace('hello', '早上好')
    with open('a.txt', mode='wt', encoding='utf-8') as f2:
        f2.write(res)
    
    
    # 方式二:
    # 1、以r模式打开源文件,然后以w模式打开一个临时文件
    # 2、从源文件中读一行到内存中,修改完毕后直接写入临时文件,循环往复直到操作完毕所有行
    # 3、删除源文件,将临时文件名改为源文件名
    # 优点:没有对内存造成过度的占用
    # 缺点:需要硬盘预留出足够的空间来存放临时文件
    
    import os
    with open('a.txt', mode='rt', encoding='utf-8') as src_f,
            open('.a.txt.swp', mode='wt', encoding='utf-8') as dst_f:
    
        for line in src_f:
            dst_f.write(line.replace('你好', 'Hello'))
    
    os.remove('a.txt')
    os.rename('.a.txt.swp', 'a.txt')
    

    5.7 Type hinting

    # Type hinting
    def add(x: int, y: int) -> int:
        res = x + y
        return res
    
    
    print(add.__annotations__)
    # {'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}
    
  • 相关阅读:
    Mongodb C#客户端数据关联数据,使用Linq语法进行关联
    express增加swagger功能
    RabbitMQ错误检查
    nodejs mongoose populate 多层模型
    c# Mongodb
    vscode安装过的插件
    phantomjs安装步骤
    记录平时有用到的前端学习网站
    初学做uniapp项目过程梳理的一些记录
    用纯css实现双边框效果
  • 原文地址:https://www.cnblogs.com/caojiaxin/p/14087484.html
Copyright © 2020-2023  润新知