侧边栏壁纸
博主头像
phphi

phphi's blog

  • 累计撰写 51 篇文章
  • 累计收到 0 条评论

Day21 - 文件读写和异常处理

2026-4-24 / 0 评论 / 1 阅读

文件操作与异常处理

文件操作

打开与关闭文件

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