授课语音

Python的文件操作和异常机制

1. 定义

文件操作 Python支持文本文件和二进制文件的操作,主要通过open函数打开文件。常用的方法包括readwritereadlinesclose等。打开文件时可以指定不同的模式:

  • 'r':只读模式,默认模式。
  • 'w':写入模式,会覆盖文件,如果文件不存在则创建新文件。
  • 'a':追加模式,新的内容会添加到文件末尾。
  • 'b':二进制模式,用于处理二进制文件。
  • '+':读写模式,可以同时读取和写入。

异常机制 异常是程序运行时发生的错误,Python通过try...except块来处理异常。常见的异常类型包括FileNotFoundErrorIOErrorValueError等。异常处理的结构包括:

  • try块:包含可能发生异常的代码。
  • except块:处理异常的代码。
  • finally块:无论是否发生异常,都会执行的代码,比如关闭文件流。

我们还可以自定义异常,通过继承Exception类来创建自己的异常,这在实际项目中常用,以便更好地跟踪问题。

2. 代码案例

# 1. 文本文件的读写
# 写入文本文件
try:
    # 使用with语句打开文件,确保文件在使用后自动关闭
    with open('example.txt', 'w', encoding='utf-8') as file:
        file.write("Hello, world!\n")  # 写入一行文本
        file.write("Welcome to file handling in Python.")  # 写入另一行文本
except IOError as e:
    print(f"写入文件失败: {e}")  # 捕获写入文件时的IO错误

# 读取文本文件
try:
    with open('example.txt', 'r', encoding='utf-8') as file:
        content = file.read()  # 读取文件的全部内容
        print(f"读取文本文件内容:\n{content}")  # 打印读取的内容
except IOError as e:
    print(f"读取文件失败: {e}")  # 捕获读取文件时的IO错误

# 2. 二进制文件的读写
# 写入二进制文件
try:
    with open('example.bin', 'wb') as file:
        file.write(b'\x00\x01\x02\x03\x04')  # 写入字节数据
except IOError as e:
    print(f"写入二进制文件失败: {e}")  # 捕获写入二进制文件时的IO错误

# 读取二进制文件
try:
    with open('example.bin', 'rb') as file:
        binary_content = file.read()  # 读取二进制文件的内容
        print(f"读取二进制文件内容:\n{binary_content}")  # 打印读取的二进制数据
except IOError as e:
    print(f"读取二进制文件失败: {e}")  # 捕获读取二进制文件时的IO错误

# 3. 文件的追加模式
# 追加文本到文件
try:
    with open('example.txt', 'a', encoding='utf-8') as file:
        file.write("\nAppending a new line.")  # 追加一行文本
except IOError as e:
    print(f"追加文本到文件失败: {e}")  # 捕获追加文件时的IO错误

# 读取追加后的文本文件
try:
    with open('example.txt', 'r', encoding='utf-8') as file:
        updated_content = file.read()  # 读取文件的全部内容
        print(f"读取追加后的文本文件内容:\n{updated_content}")  # 打印更新后的内容
except IOError as e:
    print(f"读取追加后的文件失败: {e}")  # 捕获读取追加文件时的IO错误

# 4. 文件的逐行读取
# 写入多行文本
try:
    with open('example_lines.txt', 'w', encoding='utf-8') as file:
        file.writelines([  # 写入多行文本
            "Line 1\n",
            "Line 2\n",
            "Line 3\n"
        ])
except IOError as e:
    print(f"写入多行文本失败: {e}")  # 捕获写入多行文件时的IO错误

# 逐行读取文件
try:
    with open('example_lines.txt', 'r', encoding='utf-8') as file:
        for line in file:  # 逐行读取文件
            print(f"读取一行: {line.strip()}")  # 去掉行末的换行符并打印
except IOError as e:
    print(f"逐行读取文件失败: {e}")  # 捕获逐行读取文件时的IO错误

# 5. 文件路径操作
import os

# 获取文件的绝对路径
file_path = os.path.abspath('example.txt')
print(f"文件的绝对路径: {file_path}")  # 打印文件的绝对路径

# 检查文件是否存在
if os.path.exists(file_path):
    print(f"文件 '{file_path}' 存在")  # 文件存在
else:
    print(f"文件 '{file_path}' 不存在")  # 文件不存在

# 获取文件大小
try:
    file_size = os.path.getsize(file_path)  # 获取文件大小
    print(f"文件大小: {file_size} bytes")  # 打印文件大小
except OSError as e:
    print(f"获取文件大小失败: {e}")  # 捕获获取文件大小时的错误

# 6. 使用 `pathlib` 进行文件路径操作
from pathlib import Path

# 获取文件路径
path = Path('example.txt')
print(f"文件路径: {path}")  # 打印文件路径

# 检查文件是否存在
print(f"文件存在: {path.exists()}")  # 检查文件是否存在并打印

# 获取文件大小
try:
    print(f"文件大小: {path.stat().st_size} bytes")  # 获取并打印文件大小
except OSError as e:
    print(f"获取文件大小失败: {e}")  # 捕获获取文件大小时的错误

# 7. 读取大文件
# 模拟大文件的逐块读取
def read_large_file(file_path, chunk_size=1024):
    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            while chunk := file.read(chunk_size):  # 逐块读取文件
                print(f"读取块大小: {len(chunk)}")  # 打印当前读取块的大小
    except IOError as e:
        print(f"读取大文件失败: {e}")  # 捕获读取大文件时的IO错误

# 写入大文件
try:
    with open('large_file.txt', 'w', encoding='utf-8') as file:
        file.write("A" * 10**6)  # 写入1MB的数据
except IOError as e:
    print(f"写入大文件失败: {e}")  # 捕获写入大文件时的IO错误

# 读取大文件
read_large_file('large_file.txt')

# 8. 使用 `shutil` 复制文件
import shutil

# 复制文件
try:
    shutil.copy('example.txt', 'example_copy.txt')  # 复制文件
    print("文件复制成功")  # 复制成功的提示
except IOError as e:
    print(f"复制文件失败: {e}")  # 捕获复制文件时的IO错误

# 确认复制成功
try:
    with open('example_copy.txt', 'r', encoding='utf-8') as file:
        copy_content = file.read()  # 读取复制后的文件内容
        print(f"复制文件内容:\n{copy_content}")  # 打印复制文件的内容
except IOError as e:
    print(f"读取复制文件失败: {e}")  # 捕获读取复制文件时的IO错误

这段代码展示了如何在Python中进行文件的读写操作,以及如何处理异常情况。通过合理使用这些功能,可以有效地管理文件,确保程序的稳定性和可靠性。

去1:1私密咨询

系列课程: