Python 基础篇(七):第七章: 文件操作
Python 基础篇(七):第七章: 文件操作
Prorise第七章. 文件操作:读写数据
在前面的章节中,我们学习了变量、数据容器、条件判断、循环。但到目前为止,我们的程序一旦关闭,所有数据都会丢失。这一章,我们将学习文件操作,让程序能够保存和读取数据。
7.1. 为什么需要文件操作?
7.1.1. 数据持久化的需求
假设你写了一个学生成绩管理程序,用列表存储所有学生的成绩:
1 | students = [ |
但这样有个问题:程序关闭后,所有数据都会丢失。下次运行程序时,又要重新输入所有数据。
文件操作可以解决这个问题:把数据保存到文件中,下次运行程序时再从文件中读取。
7.1.2. 文件操作的应用场景
场景 1:配置文件
程序的配置信息(如数据库连接、API 密钥)通常保存在配置文件中。
场景 2:日志记录
程序运行时的重要信息(如错误、警告)需要记录到日志文件中,方便后续排查问题。
场景 3:数据导入导出
从 Excel、CSV 文件中读取数据,或者将处理结果导出到文件中。
场景 4:数据备份
定期将重要数据保存到文件中,防止数据丢失。
7.2. 文件的打开与关闭
7.2.1. open() 函数的基本用法
open() 函数用于打开文件,返回一个文件对象:
1 | # 打开文件 |
关键点:
- 第一个参数:文件路径
- 第二个参数:打开模式(
r表示只读) encoding参数:指定文件编码(推荐使用utf-8)- 使用完文件后,必须调用
close()关闭文件
7.2.2. 文件打开模式详解
| 模式 | 说明 | 文件不存在 | 文件存在 | 常见用途 |
|---|---|---|---|---|
r | 只读模式 | 报错 | 从头读取 | 读取配置文件 |
w | 只写模式 | 创建新文件 | 清空内容 | 生成报告 |
a | 追加模式 | 创建新文件 | 在末尾追加 | 日志记录 |
r+ | 读写模式 | 报错 | 可读可写 | 需要同时读写 |
w+ | 读写模式 | 创建新文件 | 清空内容 | 先写后读 |
a+ | 追加读写 | 创建新文件 | 追加且可读 | 日志分析 |
常用模式:
r:读取文件(最常用)w:写入文件(会清空原内容,小心使用)a:追加内容(不会清空原内容,更安全)
示例:
1 | # 只读模式 |
7.2.3. with 语句:自动关闭文件
手动调用 close() 容易忘记,而且如果程序出错,close() 可能不会执行。推荐使用 with 语句,它会自动关闭文件:
1 | # 使用 with 语句(推荐) |
with 语句的优势:
- 自动关闭文件,不需要手动调用
close() - 即使程序出错,文件也会被正确关闭
- 代码更简洁
7.2.4. 常见错误与避坑指南
错误 1:文件不存在
1 | # ❌ 错误:文件不存在 |
如何避免? 使用 w 或 a 模式会自动创建文件。
错误 2:忘记关闭文件
1 | # ❌ 错误:忘记关闭文件 |
如何避免? 使用 with 语句。
错误 3:编码问题
1 | # ❌ 错误:没有指定编码 |
如何避免? 始终指定 encoding="utf-8"。
7.3. 文件的读取
7.3.1. read():一次性读取全部内容
read() 方法会一次性读取文件的全部内容,返回一个字符串:
1 | with open("data.txt", "r", encoding="utf-8") as file: |
适用场景:文件较小(几 MB 以内)。
注意:如果文件很大(如几百 MB),一次性读取会占用大量内存。
7.3.2. readline():逐行读取
readline() 方法每次读取一行,返回一个字符串(包含换行符 \n):
1 | with open("data.txt", "r", encoding="utf-8") as file: |
适用场景:需要逐行处理文件内容。
7.3.3. readlines():读取所有行到列表
readlines() 方法读取所有行,返回一个列表,每个元素是一行(包含换行符 \n):
1 | with open("data.txt", "r", encoding="utf-8") as file: |
适用场景:需要对所有行进行处理。
7.3.4. 遍历文件对象:最佳实践
推荐方式:直接遍历文件对象,这是最节省内存的方式:
1 | with open("data.txt", "r", encoding="utf-8") as file: |
为什么推荐?
- 不会一次性加载整个文件到内存
- 适用于任意大小的文件
- 代码简洁
7.3.5. 常见错误与避坑指南
错误 1:重复读取
1 | with open("data.txt", "r", encoding="utf-8") as file: |
为什么? 第一次 read() 后,文件指针已经到达文件末尾。
如何避免? 使用 seek(0) 重置文件指针:
1 | with open("data.txt", "r", encoding="utf-8") as file: |
错误 2:忘记去除换行符
1 | with open("data.txt", "r", encoding="utf-8") as file: |
如何避免? 使用 strip() 去除换行符:
1 | with open("data.txt", "r", encoding="utf-8") as file: |
7.4. 文件的写入
7.4.1. write():写入字符串
write() 方法写入一个字符串到文件:
1 | with open("output.txt", "w", encoding="utf-8") as file: |
注意:write() 不会自动添加换行符,需要手动添加 \n。
7.4.2. writelines():写入多行
writelines() 方法写入一个字符串列表到文件:
1 | lines = ["第一行\n", "第二行\n", "第三行\n"] |
注意:writelines() 也不会自动添加换行符。
7.4.3. 追加模式 vs 覆盖模式
覆盖模式(w):会清空文件原有内容
1 | # 第一次写入 |
追加模式(a):不会清空文件原有内容
1 | # 第一次写入 |
7.4.4. 常见错误与避坑指南
错误 1:使用 w 模式误删数据
1 | # ❌ 错误:使用 w 模式会清空原内容 |
如何避免? 如果不确定,使用 a 模式更安全。
错误 2:忘记添加换行符
1 | with open("output.txt", "w", encoding="utf-8") as file: |
如何避免? 手动添加 \n。
7.5. 文件指针与定位
7.5.1. tell():获取当前位置
tell() 方法返回文件指针的当前位置(字节数):
1 | with open("data.txt", "r", encoding="utf-8") as file: |
7.5.2. seek():移动文件指针
seek() 方法移动文件指针到指定位置:
1 | with open("data.txt", "r", encoding="utf-8") as file: |
语法:file.seek(offset, whence)
offset:偏移量(字节数)whence:参考位置0:文件开头(默认)1:当前位置2:文件末尾
7.5.3. 实战:读取文件的最后几行
1 | def read_last_lines(filename, n=10): |
7.6. 文件路径操作
7.6.1. os.path 模块的基本用法
os.path 模块提供了文件路径操作的函数:
1 | import os |
7.6.2. 路径拼接与分割
1 | import os |
7.6.3. 路径检查
1 | import os |
7.6.4. pathlib:现代化的路径操作
pathlib 是 Python 3.4+ 引入的现代化路径操作库,使用面向对象的方式:
1 | from pathlib import Path |
pathlib vs os.path:
| 功能 | os.path | pathlib |
|---|---|---|
| 路径拼接 | os.path.join(a, b) | Path(a) / b |
| 获取文件名 | os.path.basename(path) | path.name |
| 检查存在 | os.path.exists(path) | path.exists() |
| 读取文件 | open(path).read() | path.read_text() |
推荐:新项目使用 pathlib,它更简洁、更直观。
7.7. 目录操作
7.7.1. 创建目录
1 | import os |
参数说明:
exist_ok=True:如果目录已存在,不报错parents=True:自动创建父目录
7.7.2. 删除目录
1 | import os |
7.7.3. 列出目录内容
1 | import os |
7.7.4. 遍历目录树
os.walk() 可以递归遍历目录树:
1 | import os |
返回值:
root:当前目录路径dirs:当前目录下的子目录列表files:当前目录下的文件列表
7.8. 文件的复制、移动和删除
7.8.1. shutil 模块简介
shutil 模块提供了高级的文件操作函数:
1 | import shutil |
7.8.2. 复制文件
1 | import shutil |
7.8.3. 移动文件
1 | import shutil |
7.8.4. 删除文件
1 | import os |
7.9. 本章小结
本章学习了文件操作的核心知识,从文件的打开、读取、写入,到文件路径操作、目录操作和文件管理。
核心要点:
| 知识点 | 使用场景 | 关键语法 |
|---|---|---|
| 文件打开 | 读写文件 | open(file, mode, encoding) |
| with 语句 | 自动关闭文件 | with open(...) as file: |
| 文件读取 | 读取文件内容 | read(), readline(), readlines() |
| 文件写入 | 写入文件内容 | write(), writelines() |
| 文件指针 | 定位文件位置 | tell(), seek() |
| 路径操作 | 处理文件路径 | os.path, pathlib |
| 目录操作 | 管理目录 | mkdir(), listdir(), os.walk() |
| 文件管理 | 复制移动删除 | shutil.copy(), shutil.move(), os.remove() |
最佳实践:
- 始终使用
with语句打开文件 - 始终指定
encoding="utf-8" - 使用
a模式比w模式更安全 - 新项目推荐使用
pathlib




