文件操作与异常处理
文件操作
打开与关闭文件
open() 函数返回文件对象,操作完成后必须关闭以释放资源。
file = open('data.txt', 'r', encoding='utf-8') # 读取文本
print(file.read())
file.close()
操作模式:
| 模式 | 含义 |
|---|---|
'r' |
读取(默认) |
'w' |
写入(覆盖) |
'x' |
写入(文件存在则报错) |
'a' |
追加 |
'b' |
二进制模式 |
'+' |
读写同时 |
读取文本文件
# 方式1:一次性读取
with open('data.txt', 'r', encoding='utf-8') as f:
content = f.read()
# 方式2:逐行读取
with open('data.txt', 'r', encoding='utf-8') as f:
for line in f:
print(line, end='')
# 方式3:读取到列表
with open('data.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
写入文本文件
# 覆盖写入
with open('data.txt', 'w', encoding='utf-8') as f:
f.write('第一行\n')
f.write('第二行')
# 追加写入
with open('data.txt', 'a', encoding='utf-8') as f:
f.write('\n新追加的内容')
读写二进制文件
# 复制图片
with open('photo.jpg', 'rb') as f1:
data = f1.read()
with open('photo_copy.jpg', 'wb') as f2:
f2.write(data)
# 大文件分块读写
with open('photo.jpg', 'rb') as f1, open('photo_copy.jpg', 'wb') as f2:
while chunk := f1.read(4096): # 每次读取4KB
f2.write(chunk)
异常处理
基本结构
try:
# 可能引发异常的代码
result = 10 / int(user_input)
except ValueError:
print("请输入有效数字")
except ZeroDivisionError:
print("不能除以零")
else:
# 仅在 try 无异常时执行
print(f"结果:{result}")
finally:
# 无论是否有异常都执行
print("清理资源")
抛出异常
def factorial(n):
if n < 0:
raise ValueError("不能计算负数的阶乘")
if n <= 1:
return 1
return n * factorial(n - 1)
try:
print(factorial(-1))
except ValueError as e:
print(e)
自定义异常
class ValidationError(Exception):
"""验证异常"""
def __init__(self, msg, code=400):
self.msg = msg
self.code = code
super().__init__(msg)
常见内置异常
| 异常 | 场景 |
|---|---|
FileNotFoundError |
文件不存在 |
UnicodeDecodeError |
编码解码错误 |
ValueError |
值不合法 |
KeyError |
字典键不存在 |
IndexError |
索引越界 |
上下文管理器
with 语句自动管理资源,确保文件正确关闭:
# 推荐写法:无需手动 close
try:
with open('data.txt', 'r', encoding='utf-8') as f:
print(f.read())
except FileNotFoundError:
print("文件不存在")
总结
- 用
open()打开文件,with自动关闭 r/w/a控制读写模式,b表示二进制try/except/finally捕获和处理异常raise主动抛出异常,自定义异常继承Exception