文件和异常处理是Python编程中不可或缺的技能。本章将带你从基础到进阶,彻底掌握文件操作和异常处理的核心知识点,并通过通俗易懂的示例帮助所有人理解。
10.1 从文件中读取数据
10.1.1 读取整个文件
要读取文件内容,首先需要打开文件,使用 open() 函数并指定文件路径和模式(如 'r' 表示只读)。例如:
with open('pi_digits.txt', 'r') as file:
contents = file.read()
print(contents)
使用 with 语句可以自动关闭文件,避免资源泄露。file.read() 会一次性读取文件全部内容。
10.1.2 文件路径
- 相对路径:相对于当前脚本的位置,如 data/pi.txt。
- 绝对路径:完整的系统路径,如 /home/user/documents/pi.txt。
在Windows中注意反斜杠转义(C:\\path\\to\\file)或使用原始字符串(r'C:\path\to\file'`。
10.1.4 逐行读取与列表存储
若想逐行处理文件内容,可以使用循环:
with open('pi_digits.txt') as file:
lines = file.readlines() # 将各行存入列表
for line in lines:
print(line.strip()) # 去除每行末尾的换行符
10.1.6 处理百万行大文件
直接读取大文件可能导致内存不足。此时可逐行处理:
with open('big_file.txt') as file:
for line in file:
process(line) # 每次处理一行,内存友好
10.2 写入文件
10.2.1 写入空文件
使用 'w' 模式打开文件,若文件不存在则会创建:
with open('output.txt', 'w') as file:
file.write("Hello, World!")
⚠️ 注意:'w' 模式会覆盖原有内容!
10.2.3 追加内容
用 'a' 模式追加内容到文件末尾:
with open('output.txt', 'a') as file:
file.write("\nAppended line.")
10.3 异常处理:让程序更健壮
10.3.1 处理 ZeroDivisionError
当除数为零时,程序会崩溃。通过 try-except 捕获异常:
try:
print(5 / 0)
except ZeroDivisionError:
print("除数不能为零!")
10.3.5 处理 FileNotFoundError
读取不存在的文件时抛出此异常:
filename = 'missing.txt'
try:
with open(filename) as file:
content = file.read()
except FileNotFoundError:
print(f"文件 {filename} 不存在!")
10.3.8 静默失败
若想忽略某些异常,可用 pass:
try:
# 可能出错的代码
except FileNotFoundError:
pass # 静默处理
10.4 存储数据:JSON的妙用
10.4.1 使用 json.dump() 和 json.load()
将数据保存为JSON格式:
import json
data = {'name': 'Alice', 'age': 30}
with open('data.json', 'w') as file:
json.dump(data, file) # 写入文件
# 读取JSON数据
with open('data.json') as file:
loaded_data = json.load(file)
print(loaded_data['name']) # 输出:Alice
10.4.3 重构代码
将功能拆分为独立函数,提升可维护性:
def save_user_data(username):
"""保存用户数据到JSON文件"""
with open('users.json', 'w') as file:
json.dump({'username': username}, file)
10.5 小结与最佳实践
- 文件操作:优先使用 with 语句,避免忘记关闭文件。
- 异常处理:精准捕获特定异常(如 FileNotFoundError),避免笼统的 except。
- 数据存储:JSON适合存储结构化数据,且跨平台兼容。
- 代码风格:添加清晰的注释,拆分复杂操作为函数。
通过本章学习,你将能够优雅地处理文件读写、从容应对程序错误,并掌握数据持久化的核心技巧。现在,动手写一段代码试试吧!