目录
- 文件读写基础
- 异常处理
- 包与模块管理
- 实战项目
第一部分:文件读写基础
为什么要学文件操作?
程序运行时的数据存储在内存中,程序结束后数据就消失了。文件操作让我们能够:
- 数据持久化:保存数据到硬盘
- 数据读取:读取之前保存的数据
- 大数据处理:处理超过内存容量的数据
- 日志记录:记录程序运行过程
文件操作的三个步骤
1 | 1. 打开文件 (open) |
open() 函数详解
基本语法
1 | open(filename, mode, encoding) |
参数说明
| 参数 | 说明 | 示例 |
|---|---|---|
| filename | 文件名或路径 | ‘example.txt’, ‘./data/file.txt’ |
| mode | 打开模式 | ‘r’, ‘w’, ‘a’, ‘x’ |
| encoding | 编码方式 | ‘utf-8’, ‘gbk’ |
打开模式详解
| 模式 | 含义 | 文件存在 | 文件不存在 |
|---|---|---|---|
| ‘r’ | 读取(默认) | 打开 | 报错 |
| ‘w’ | 写入 | 覆盖 | 创建 |
| ‘a’ | 追加 | 追加 | 创建 |
| ‘x’ | 创建 | 报错 | 创建 |
最简单的文件读取
1 | # 方式1:一次性读取全部内容 |
为什么使用 with 语句?
- 自动打开文件
- 自动关闭文件
- 即使发生错误也会关闭文件
- 代码更简洁
三种读取方式
方式1:read() - 一次性读取全部
1 | with open('example.txt', 'r', encoding='utf-8') as f: |
适用场景:小文件,需要全部内容
风险:大文件会占用大量内存
方式2:readline() - 逐行读取
1 | with open('example.txt', 'r', encoding='utf-8') as f: |
适用场景:需要逐行处理
优点:内存占用少
方式3:readlines() - 读取所有行到列表
1 | with open('example.txt', 'r', encoding='utf-8') as f: |
适用场景:需要随机访问行
风险:大文件占用内存
方式4:迭代读取(最推荐)
1 | with open('example.txt', 'r', encoding='utf-8') as f: |
优点:
- 内存效率最高
- 代码最简洁
- 最Pythonic
处理大文件
分块读取
1 | def read_large_file_by_chunks(filename, chunk_size=1024): |
按行分块读取
1 | def read_large_file_by_lines(filename, batch_size=1000): |
文件写入
写入模式
1 | # 模式1:写入(覆盖) |
写入列表
1 | lines = ['第一行\n', '第二行\n', '第三行\n'] |
文件指针操作
1 | with open('example.txt', 'r', encoding='utf-8') as f: |
处理 CSV 文件
1 | # 读取 CSV |
处理 JSON 文件
1 | import json |
第二部分:异常处理
什么是异常?
异常是程序执行过程中发生的错误事件。
常见异常类型:
FileNotFoundError- 文件不存在PermissionError- 没有权限ValueError- 值错误TypeError- 类型错误ZeroDivisionError- 除以零IndexError- 索引超出范围KeyError- 字典键不存在
为什么需要异常处理?
- 防止程序崩溃 - 程序可以继续运行
- 提供有意义的错误信息 - 帮助用户理解问题
- 采取恢复措施 - 尝试其他方法或保存数据
基础异常处理:try-except
基本结构
1 | try: |
示例1:捕获特定异常
1 | def safe_divide(a, b): |
示例2:文件操作中的异常处理
1 | def safe_read_file(filename): |
2.4 捕获多个异常
方式1:多个 except 块
1 | try: |
方式2:一个 except 块捕获多个异常
1 | try: |
获取异常信息
1 | try: |
完整的异常处理结构
1 | try: |
执行流程:
- 执行 try 块
- 如果发生异常,执行对应的 except 块
- 如果没有异常,执行 else 块
- 无论如何,最后执行 finally 块
finally 块的重要用途
1 | f = None |
注意:这种方式不如 with 语句安全,推荐使用 with 语句。
异常的传播
1 | def func2(): |
异常传播链:
1 | main() |
实战:安全的文件读写
1 | def safe_read_file(filename): |
第三部分:包与模块管理
模块与包的概念
模块(Module)
- 单个
.py文件 - 包含 Python 代码
- 可以被导入使用
包(Package)
- 包含
__init__.py文件的目录 - 可以包含多个模块和子包
- 用于组织相关的模块
最小包结构
1 | myproject/ |
完整包结构
1 | myproject/ |
init.py 的作用
作用1:标记目录为包
1 | # 有 __init__.py 的目录被识别为包 |
作用2:初始化包
1 | # mypackage/__init__.py |
作用3:定义公共接口
1 | # mypackage/__init__.py |
导入方式
方式1:导入整个模块
1 | import mypackage.core.engine |
方式2:导入特定内容
1 | from mypackage.core.engine import Engine |
方式3:导入子包
1 | from mypackage.core import engine |
方式4:相对导入(仅在包内使用)
1 | # 在 mypackage/io/reader.py 中 |
创建自定义包
步骤1:创建目录结构
1 | mkdir datatools |
步骤2:创建 init.py 文件
1 | # datatools/__init__.py |
步骤3:创建模块文件
1 | # datatools/core/processor.py |
步骤4:使用包
1 | import datatools |
setup.py - 包的安装配置
1 | from setuptools import setup, find_packages |
安装包
1 | # 本地开发安装(推荐) |
requirements.txt
1 | # requirements.txt |
使用方式:
1 | pip install -r requirements.txt |
第四部分:实战项目
项目1:学生成绩管理系统
项目结构
1 | grade_system/ |
main.py
1 | import csv |
项目2:日志记录系统
项目结构
1 | log_system/ |
logger.py
1 | import os |
项目3:配置文件管理
项目结构
1 | config_system/ |
config_manager.py
1 | import json |