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")  # 重名命成原文件
    
    
posted on 2019-09-18 08:45  天狼大大  阅读(218)  评论(0编辑  收藏  举报