• Python基础(八)


    今日主要内容

    • 文件操作
      • 文件路径
      • 打开方式
      • 编码方式
      • 文件句柄
    • 文件修改

    一、文件操作

    (一)文件操作的用途

    • 我们运行代码时产生的数据和记录,存储在内存中,当程序运行完,产生的数据和记录就会被释放掉,如果我们需要这个数据或记录以便下次使用,那就需要用文件存储起来(如商城的购买记录等)
    • 文件操作用于:持久化存储数据
    • 文件操作的三步骤:
      • 打开文件
      • 操作文件
      • 关闭文件

    (二)文件操作的格式

    • f = open(文件路径, 打开方式, 编码方式)

      f = open("text.txt", mode="r", encoding="utf-8")
      """文件操作"""
      f.close()
      
    • with open(文件路径, 打开方式, 编码方式) as f:

      • 以此方式打开文件不需要手动关闭文件,自动关闭
      • 可以打开多个文件
        • with open(...) as f1, open(...) as f2:
      with open("text.txt", mode="r", encoding="utf-8") as f:
      	"""文件操作"""
      

    (三)文件路径

    • 文件路径:文件所在的位置
    • 分为 绝对路径相对路径
    1. 绝对路径:

      • 从磁盘根目录一直到文件名的路径
      path = "C:\Users\11582\Desktop\笔记\day08"
      
    2. 相对路径

      • 同一个文件夹下的文件,如果在同一个文件夹,那么相对路径就是这个文件名,如果在上一层文件夹则需要:../
      path = "../装饰器/测试.txt"
      

    3. 转义:

      • 用两个\\代表\

      • 路径前加一个r

        path = r"C:\Users\11582\Desktop\笔记\day08"
        

    (四)打开方式

    • mode可以省略,直接填入打开方式,若不填默认为只读"r"

    • r 只读
      w 只写(清空写)
      a 追加(追加写)
      rb 以字节方式打开文件用于只读
      wb 以字节方式打开文件用于只写(清空写)
      ab 以字节方式打开文件用于追加(追加写)
      r+ 读写
      w+ 写读(清空写)
      a+ 追加写读(追加写)
      r+b 以字节方式打开文件用于读写
      w+b 以字节方式打开文件用于写读(清空写)
      a+b **以字节方式打开文件用于追加(追加写) **
    1. mode="r"

      • 以只读方式打开文件
      • 默认参数为只读"r"
      • 文件读取得到的是字符串
      f = open("text.txt", "r", encoding="utf-8")
      s = f.read()
      f.close()
      print(s)  # 打印文件内容
      
    2. mode="w"

      • 以只写方式打开文件
      • 文件打开时清空文件,之后写入内容
      • 若文件不存在创建文件
      • 只能写入字符串
      f = open("text.txt", "w", encoding="utf-8")
      f.write("文件操作")
      f.flush()
      f.close()  # 写入"文件操作"
      
    3. mode="a"

      • 以追加方式打开文件,可以在文件末尾追加写入内容
      f = open("text.txt", "a", encoding="utf-8")
      f.write("文件操作")
      f.flush()
      f.close()  # 在文件末尾写入"文件操作"
      
    4. mode="rb"

      • 以字节方式打开文件用于只读
      • 一般用于打开非文本文件,如图片、音频、视频等
      • 以"rb"方式打开文件不能输入编码方式,输入会报错
      f = open("LOL.jpg", "rb")
      s = f.read()
      f.close()
      print(s)  # 打印文件内容(二进制码)
      
      
    5. mode="wb"

      • 以字节方式打开文件用于只写
      • 文件打开时清空文件,之后写入内容
      • 若文件不存在创建文件
      • 只能写入字符串
      f = open("LOL.jpg", "rb")
      s = f.read()
      f.close()
      
      f = open("皮肤.png", "wb")
      f.write(s)
      f.flush()
      f.close()
      
      
    6. mode="ab"

      • 以字节方式打开文件用于追加,可以在文件末尾追加写入内容
      f = open("LOL.jpg", "rb")
      s = f.read()
      f.close()
      
      f = open("LOL.jpg", "ab")
      f.write(s)
      f.flush()
      f.close()
      
      
    7. mode="r+"

      • 以读写方式打开文件,先读后写
      • 无论读到哪个字符,写都从文件最后开始写入
      • 若先写入,则会覆盖文件不会清空,按照对应字节数覆盖
      f = open("text.txt", "r+", encoding="utf-8")
      s = f.read()
      f.write("文件操作")  # 在文件末尾追加"文件操作"
      f.flush()
      f.close()
      print(s)  
      
      
      f = open("text.txt", "r+", encoding="utf-8")
      f.write("123")  # 将文件中的"文"替换成"123"  一个中文对应三个字节
      f.flush()
      f.close()
      
      
    8. mode="w+"

      • 以写读方式打开文件
      • 因为打开的时候清空文件,无论先写后读,还是先读后写,都无法读到内容,所以一般很少用
      f = open("text.txt", "w+", encoding="utf-8")
      f.write("文件操作")
      f.flush()
      f.close()
      
      
    9. mode="a+"

      • 以追加写读方式打开文件
      • 在文件末尾追加
      f = open("text.txt", "a+", encoding="utf-8")
      s.seek(0)
      s = f.read()
      f.write("文件操作")
      f.flush()
      f.close()
      
      
    10. mode="r+b"

      • 以字节方式打开文件用于读写
    11. mode="w+b"

      • 以字节方式打开文件用于写读
    12. mode="a+b"

      • 以字节方式打开文件用于追加写读

    (五)编码方式

    • 编码方式决定文件的读写以何种方式进行编码
    • windows使用的编码方式是GBK(终端)
    • Pycharm使用的是编码方式是UTF-8
    • 打开方式所有以字节打开打开的都不能填入编码方式

    (六)文件句柄

    • 用来操作文件的媒介,文件操作的所有方法都针对于文件句柄

    • 文件句柄是一个迭代器,可以进行for循环

    • f.read() 读取全部内容
      f.readline() 读取一行内容
      f.readlines() 读取全部内容
      f.close() 关闭文件
      f.write() 写入内容
      f.flush() 刷新内容
      f.seek() 移动光标
      f.tell() 获取光标位置
      f.truncate() 截断文件
    1. f.read()

      • 读取文件全部内容
      • 弊端:如果文件过大,导致内存崩溃
      • read(n)方法可填入参数n,读取n个字符
      f = open("text.txt", "r", encoding="utf-8")
      s = f.read(3)  # 读取前3个字符
      s1 = f.read()  # 读取剩余全部内容
      f.close()
      
      
    2. f.readline()

      • 读取文件一行内容
      • 末尾带一个换行符,可以利用strip()删除
      f = open("text.txt", "r", encoding="utf-8")
      s = f.readline()  # 读取文件一行内容
      f.close()
      
      
    3. f.readlines()

      • 读取文件全部内容,将每一行的内容放在一个列表中
      • 每一行内容为一个字符串,末尾带一个换行符
      f = open("text.txt", "r", encoding="utf-8")
      s = f.readlines()  # 读取文件全部内容,得到一个列表
      f.close()
      
      
    • 注意:文件读取的结果为字符串类型
    1. f.close()

      • 关闭文件
      • 文件句柄在操作完一定要关闭
      f = open("text.txt", "r", encoding="utf-8")
      s = f.read()  
      f.close()  # 关闭文件句柄
      
      
    2. f.write()

      • 向文件中写入内容
      • 若文件存在,先清空文件后写入(执行open的时候就已经清空文件了)
      • 若文件不存在,新建文件后写入
      f = open("text.txt", "w", encoding="utf-8")
      f.write("文件操作")  # 写入"文件操作"
      f.flush()
      f.close()  
      
      
    • 注意:文件只能写入字符串,写入其他类型数据会报错
    1. f.flush()

      • 刷新缓冲区,立刻写入磁盘
      • 延申:缓冲区与缓存
        • 缓冲区:
          • 首先缓冲区是内存空间的一部分,在内存空间中预留了一定的存储空间,这些空间用来暂时存储输入或输出的数据
          • 缓冲区的存在是因为硬件间存在速度差(比如内存和CPU之间、CPU和硬盘之间)高速硬件会等待低速硬件,这时需要一个缓冲区来平衡
        • 缓存:
          • 缓存存在于CPU中,由于CPU运行速度远大于内存的速度,为了避免频繁的向内存读取数据,将一部分数据存在缓存中,CPU需要使用的时候不需要再访问内存
        • 总结:缓冲区偏重于写,缓存偏重于读
      f = open("text.txt", "w", encoding="utf-8")
      f.write("文件操作")
      f.flush()  # 刷新缓冲区
      f.close()  
      
      
    2. f.seek()

      • 移动光标,文件的读写依靠光标进行
      • seek()方法有两个参数:
        • 第一个参数为移动到的位置
        • 第二个参数为光标从那个位置开始移动
          • 0:同开头开始移动
          • 1:从当前位置移动
          • 2:从结尾开始移动
        • 当第二个参数不为0时,第一个参数必须为0
      • 光标移动的单位为字节,如果文本为中文,移动一个字符需要移动三个字节
      f = open("text.txt", "r", encoding="utf-8")
      f.read()
      f.seek(0)  # 光标移动到开头
      f.read()
      f.close()
      
      
    3. f.tell()

      • 获取光标当前位置
      f = open("text.txt", "r", encoding="utf-8")
      f.read()
      f.seek(0)  # 光标移动到开头
      s1 = f.tell()  # 开头位置
      f.read()
      s2 = f.tell()  # 结尾位置
      f.close()
      
      
    4. f.truncate()

      • 截断文件,删除光标后面所有内容
      • 截断文件之前必须要移动光标,否以无法截断
      f = open("text.txt", "r", encoding="utf-8")
      f.read()
      f.seek(3)  
      f.truncate()  # 第三个字符后面的内容全部被删除
      f.close()
      
      

    二、文件修改

    • 文件修改只能将原文件内容读取到内存中,将信息修改完毕之后,写到新的文件中,将原文件删除,并将新文件重命名成原文件的名字

    • 需要导入os模块用来删除文件和重命名文件

      import os
      
      with open("text.txt", "r", encoding="utf-8") as f1,\
      	open("text副本.txt", "w", encoding="utf-8") as f2:
      	for line in f1:
      		new_line = line.replace("旧内容", "新内容")
      		f2.write(new_line)
      os.remove("text.txt")  # 删除原文件
      os.rename("text副本.txt", "text.txt")  # 重名命成原文件
      
      
  • 相关阅读:
    基数排序
    计数排序和桶排序
    部署Java Web项目到云服务器的步骤全解析
    IP地址0.0.0.0/0是什么意思
    Tomcat在阿里云Centos7上正常启动,但浏览器无法访问的解决方法
    eclipse光标怎么返回上一次浏览的位置
    IDEA设置方法自动显示参数提示
    socket通信模型、socket中的accept()阻塞与read()阻塞
    Ubuntu18.04 下修改 root密码
    Ubuntu18.04 安装 VMwareTools
  • 原文地址:https://www.cnblogs.com/tianlangdada/p/11538462.html
Copyright © 2020-2023  润新知