一、文件介绍
- 数据存放的容器, 我们使用的
.txt、.png、.avi等都是文件
1. 文件的作用
- 持久性的存储数据内容
2. 文件组成
-
文件名: 如果是同级目录下, 不允许同名文件存在
-
扩展名:
-
.jgp、.avi、.doc、.xls、.html、... -
注意: 一般不同的扩展名, 对应着不同的文件格式, 不同的文件格式, 有着不同的存储约定, 方便程序处理
-
-
文件内容:
-
文本文件:
txt、doc、xls、... -
二进制文件:
图片、视频、音乐、...
-
二、文件的使用流程
文件的使用流程共三个步骤
- 打开
- 读写
- 关闭
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 模式下
- 只可以对文件进行读取操作, 并且是从开始的位置进行读取, 无法写入数据。
- 当文件不存在时, 无法打开文件, 同时报错。
r+ 模式
- 使用
r+ 模式打开文件, 可以发现, 当文件不存在时, 会直接报错
- 手动创建test文件, 同时添加内容:
123456abcdefg
- 可以使用
read()方法, 从头读取数据, 并成功打印:123456abcdefg
- 将
read()改为write(), 并传入参数"hellow", 运行, 可以发现123456被hellow覆盖, 而abcdefg没有变, 内容变成:hellowabcdefg
总结: r+模式下
- 当文件不存在时, 直接打开文件会报错
- 支持读写操作, 并且都从开始的位置读写
- 在写入时, 会从开始的位置覆盖, 未覆盖的位置内容不变
w 和 w+
- 空工程
w 模式
- 使用
w模式, 打开不存在的文件test
- 可以发现会创建一个新的文件, 名字是
test, 文件内容为空
- 在test文件中添加内容
hellow world, 同时再次运行工程
- 可以发现之前的
hellow world被清空, 说明w模式下, 会覆盖之前的同名文件, 并创建新文件
- 再次加入内容
hellow world, 同时进行读取操作, 会发现报错
- 将
read()改为write(), 并传入参数123456, 运行
hellow world被替换为123456, 说明 w模式下, 写入操作会覆盖之前的所有内容
总结: w模式下
- 当文件不存在时, 会创建一个新的空文件
- 当文件存在时, 会创建一个新的空间文件, 并覆盖之前的旧文件
- 无法进行读取操作
- 可以进行写入操作, 并且是全覆盖的写入, 之前内容清空, 写入新内容
w+模式
- 使用
w+模式打开不存在的文件
- 成功创建了一个新的空文件
test
- 在
test中加入内容1234567890, 并执行读取操作
- 执行后, 程序没有报错, 同时
test中内容被清空
- 再次在
test文件中加入内容:1234567890, 同时将read()替换为write(), 并传入参数hellow
- 可以发现,
1234567890被hellow替换掉
总结: w+模式下
- 如果文件不存在, 会创建新的空文件
- 如果文件已存在, 会创建新的文件, 并覆盖旧文件
- 可以进行读取操作, 读取内容为空(无法读取到文件存储的数据, 不报错而已)
- 可以进行写入操作, 创建新文件覆盖旧文件, 并写入内容
a 和 a+
- 空工程
a 模式
- 执行
open("test", "a"): 使用a模式打开不存在的文件
- 可以发现, 生成了一个名为
test的空文件
- 在
test中加入内容1234567890, 不改变原代码, 再次运行程序
- 可以发现
test文件中内容没有改变, 说明a模式打开文件, 不会创建新文件来覆盖旧文件
- 接下来, 执行
read()方法, 对test进行读取操作, 程序直接报错
- 接着, 在
a模式下, 对文件进行写入操作, 写入内容hellow
- 可以发现
test文件中的内容变为1234567890hellow, 说明a模式下, 文件接着前面的内容继续写入, 原内容不变
总结: a模式
- 文件如果不存在, 会创建新的空文件
- 如果文件存在, 直接打开, 而不会创建新文件
- 不可进行读取操作, 读取直接报错
- 可以进行写入操作, 内容会写在原有内容后面, 原有内容不会被覆盖
a+模式
- 在
a+模式下, 使用open()函数, 打开不存在的文件test
- 可以发现, a+模式下打开不存在的文件, 会创建一个新的空文件
- 在test中加入内容:
1234567890
- 不改变源代码, 重新运行程序
- 可以看到,
test文件中内容没有改变, 说明没有创建新文件来覆盖旧文件
- 在
a+模式下, 对test文件进行读取操作, 发下没有任何打印, 说明a+模式下对文件进行读取操作不会报错, 但是不会读取到任何数据
- 接着对
test进行写入操作, 写入内容:hellow
test文件的内容变为1234567890hellow, 说明新内容拼接在了原有内容之后
总结: a+模式
- 当文件不存在时, 会创建新的空文件
- 当文件存在时, 不会创建新文件, 旧文件不变
- 进行读取操作时, 程序不会报错, 但是不会读取到任何内容
- 进行写入操作是, 新内容被拼接到原有内容之后
最后: rb、wb、ab、rb+、wb+、ab+与r、w、a、r+、w+、a+, 除了操作的文件是二进制文件外, 其他操作方式一致