Python基础(十五): 文件介绍和操作模式

671 阅读9分钟

一、文件介绍

  • 数据存放的容器, 我们使用的.txt、.png、.avi等都是文件

文件类型

1. 文件的作用

  • 持久性的存储数据内容

2. 文件组成

  • 文件名: 如果是同级目录下, 不允许同名文件存在

  • 扩展名:

    • .jgp、.avi、.doc、.xls、.html、...

    • 注意: 一般不同的扩展名, 对应着不同的文件格式, 不同的文件格式, 有着不同的存储约定, 方便程序处理

  • 文件内容:

    • 文本文件:txt、doc、xls、...

    • 二进制文件: 图片、视频、音乐、...

二、文件的使用流程

文件的使用流程共三个步骤

  1. 打开
  2. 读写
  3. 关闭

1、打开文件

  • 在对文件操作时, 首先需要将文件打开
  • open("文件", "模式"): Python提供的来打开指定文件的函数
    • "文件": 文件的路径, 可以使相对路径, 也可以是绝对路径
    • "模式": 指定文件可操作的模式, 比如: 只读、只写、读写等
模式 作用
r 打开一个已有文件, 并且只能进行读取操作, 无法写入, 文件不存在会报错
w 打开一个文件, 如果文件不存在则会创建新的空文件, 如果文件已存在, 会创建空文件覆盖旧文件, 原有内容被清空, 无法进行读取操作, 读取操作直接报错
a 打开一个文件, 如果文件不存在则会创建新的空文件, 如果文件已存在, 不会创建新的文件并且旧文件不变, 只能执行写入操作, 写入的新内容会被拼接在原有内容之后, 无法进行读取操作, 读取直接报错
rb 以二进制格式打开一个已有文件, 并且只能进行读取操作, 无法写入, 文件不存在会报错
wb 以二进制格式打开一个文件, 如果文件不存在则会创建新的空文件, 如果文件已存在, 会创建空文件覆盖旧文件, 原有内容被清空, 无法进行读取操作, 读取操作直接报错
ab 以二进制格式打开一个文件, 如果文件不存在则会创建新的空文件, 如果文件已存在, 不会创建新的文件并且旧文件不变, 只能执行写入操作, 写入的新内容会被拼接在原有内容之后, 无法进行读取操作, 读取直接报错
r+ 打开一个已有文件用于读写, 写入时会从内容的开始位置进行覆盖操作, 未覆盖的部分不变, 如果文件不存在, 打开文件时直接报错
w+ 打开一个文件用于读写, 如果文件不存在则会创建新文件, 如果文件已存在, 则会创建一个新文件覆盖旧文件, 进行读取操作时不会报错, 但是无法读取到内容, 从开始的位置写入内容, 原有内容被清空
a+ 打开一个文件用于读写, 如果文件不存在则会创建新文件, 如果文件已存在, 不会创建新文件, 旧原件不变, 读取操作时不会报错, 但是无法读取到内容, 写入新内容时, 新内容会被拼接到原有文件后面
rb+ 以二进制格式打开一个已有文件用于读写, 写入时会从内容的开始位置进行覆盖操作, 未覆盖的部分不变, 如果文件不存在, 打开文件时直接报错
wb+ 以二进制格式打开一个文件用于读写, 如果文件不存在则会创建新文件, 如果文件已存在, 则会创建一个新文件覆盖旧文件, 进行读取操作时不会报错, 但是无法读取到内容, 从开始的位置写入内容, 原有内容被清空
ab+ 以二进制格式打开一个文件用于读写, 如果文件不存在则会创建新文件, 如果文件已存在, 不会创建新文件, 旧原件不变, 读取操作时不会报错, 但是无法读取到内容, 写入新内容时, 新内容会被拼接到原有文件后面

2、读写文件

  • 定位

    • f.seek(字节, [0, 1, 2]): 设置句柄位置: 0、开头, 1、当前位置, 2、结尾

    • f.tell: 查看句柄当前位置

    • f.read(字节数): 字节数默认是文件内容长度, 下标会自动后移

    • f.readline()

    • f.readlines()

    • f.write("内容")
  • 文件读写操作的详细介绍, 请在Python基础(十六): 文件读写中查看

3、关闭文件

  • f.close()
    • 关闭一个打开的文件
    • 为什么需要关闭?
      • 可以释放系统资源
      • 会立即清空缓冲区的数据内容到磁盘文件
  • 补充
    • f.flush(): 立即清空缓冲区的数据内容到磁盘文件

三、文件的使用流程练习

r 和 r+

  • 空工程

空工程

r 模式
  • 当使用r模式打开文件时, 如果文件不存在, 会直接报错

  • 我们先创建一个文件, 取名为test, 同时在文件添加内容123456abcdefg

  • 再次使用r模式操作文件, 可以读取到刚才添加的内容123456abcdefg, 默认情况下r模式开始的位置读取数据

  • read()方法改为write()方法, 此次尝试, 可以发现无法进行写入操作

总结: r 模式下

  1. 只可以对文件进行读取操作, 并且是从开始的位置进行读取, 无法写入数据。
  2. 当文件不存在时, 无法打开文件, 同时报错。
r+ 模式
  • 使用 r+ 模式 打开文件, 可以发现, 当文件不存在时, 会直接报错

  • 手动创建test文件, 同时添加内容: 123456abcdefg

  • 可以使用read()方法, 从头读取数据, 并成功打印: 123456abcdefg

  • read()改为write(), 并传入参数"hellow", 运行, 可以发现123456hellow覆盖, 而abcdefg没有变, 内容变成: hellowabcdefg

总结: r+模式下

  1. 当文件不存在时, 直接打开文件会报错
  2. 支持读写操作, 并且都从开始的位置读写
  3. 在写入时, 会从开始的位置覆盖, 未覆盖的位置内容不变

w 和 w+

  • 空工程

w 模式
  • 使用 w模式, 打开不存在的文件test

  • 可以发现会创建一个新的文件, 名字是test, 文件内容为空

  • 在test文件中添加内容hellow world, 同时再次运行工程

  • 可以发现之前的hellow world被清空, 说明 w模式 下, 会覆盖之前的同名文件, 并创建新文件

  • 再次加入内容hellow world, 同时进行读取操作, 会发现报错

  • read()改为write(), 并传入参数123456, 运行

  • hellow world被替换为123456, 说明 w模式下, 写入操作会覆盖之前的所有内容

总结: w模式下

  1. 当文件不存在时, 会创建一个新的空文件
  2. 当文件存在时, 会创建一个新的空间文件, 并覆盖之前的旧文件
  3. 无法进行读取操作
  4. 可以进行写入操作, 并且是全覆盖的写入, 之前内容清空, 写入新内容
w+模式
  • 使用 w+模式 打开不存在的文件

  • 成功创建了一个新的空文件test

  • test中加入内容1234567890, 并执行读取操作

  • 执行后, 程序没有报错, 同时test中内容被清空

  • 再次在test文件中加入内容:1234567890, 同时将read()替换为write(), 并传入参数hellow

  • 可以发现, 1234567890hellow替换掉

总结: w+模式下

  1. 如果文件不存在, 会创建新的空文件
  2. 如果文件已存在, 会创建新的文件, 并覆盖旧文件
  3. 可以进行读取操作, 读取内容为空(无法读取到文件存储的数据, 不报错而已)
  4. 可以进行写入操作, 创建新文件覆盖旧文件, 并写入内容

a 和 a+

  • 空工程

a 模式
  • 执行open("test", "a"): 使用a模式打开不存在的文件

  • 可以发现, 生成了一个名为test的空文件

  • test中加入内容1234567890, 不改变原代码, 再次运行程序

  • 可以发现test文件中内容没有改变, 说明a模式打开文件, 不会创建新文件来覆盖旧文件

  • 接下来, 执行read()方法, 对test进行读取操作, 程序直接报错

  • 接着, 在a模式下, 对文件进行写入操作, 写入内容hellow

  • 可以发现test文件中的内容变为1234567890hellow, 说明a模式下, 文件接着前面的内容继续写入, 原内容不变

总结: a模式

  1. 文件如果不存在, 会创建新的空文件
  2. 如果文件存在, 直接打开, 而不会创建新文件
  3. 不可进行读取操作, 读取直接报错
  4. 可以进行写入操作, 内容会写在原有内容后面, 原有内容不会被覆盖
a+模式
  • a+模式下, 使用open()函数, 打开不存在的文件test

  • 可以发现, a+模式下打开不存在的文件, 会创建一个新的空文件

  • 在test中加入内容: 1234567890

  • 不改变源代码, 重新运行程序

  • 可以看到, test文件中内容没有改变, 说明没有创建新文件来覆盖旧文件

  • a+模式下, 对test文件进行读取操作, 发下没有任何打印, 说明a+模式下对文件进行读取操作不会报错, 但是不会读取到任何数据

  • 接着对test进行写入操作, 写入内容: hellow

  • test文件的内容变为1234567890hellow, 说明新内容拼接在了原有内容之后

总结: a+模式

  1. 当文件不存在时, 会创建新的空文件
  2. 当文件存在时, 不会创建新文件, 旧文件不变
  3. 进行读取操作时, 程序不会报错, 但是不会读取到任何内容
  4. 进行写入操作是, 新内容被拼接到原有内容之后

最后: rb、wb、ab、rb+、wb+、ab+与r、w、a、r+、w+、a+, 除了操作的文件是二进制文件外, 其他操作方式一致