第 15 课:标准库之 os 与 sys 模块
1. 学习目标
通过本课学习,你将能够:
- 掌握使用
os模块进行常见的文件系统操作,如路径操作、目录遍历和文件属性查看。 - 了解如何使用
os模块执行跨平台的系统命令。 - 理解
sys模块的主要功能,包括获取命令行参数、操作 Python 运行时环境。 - 能够结合
os和sys模块编写简单的系统管理或自动化脚本。
2. 核心概念
2.1 os 模块:与操作系统交互的桥梁
os(Operating System)模块是 Python 与操作系统进行交互的核心接口。它提供了一系列函数来操作文件系统、管理进程和获取系统信息。使用这个模块,你的代码可以在 Windows、Linux 或 macOS 上以统一的方式执行许多系统级任务。
核心功能分类:
- 路径操作 (
os.path): 处理文件路径,如拼接、分割、判断是否存在。 - 目录与文件操作: 创建、删除、列出目录或文件。
- 环境变量: 获取或设置操作系统环境变量。
- 系统命令: 执行 shell 命令(使用
os.system或更安全的subprocess模块)。
2.2 sys 模块:与 Python 解释器交互的通道
sys(System)模块包含了与 Python 解释器及其运行环境密切相关的变量和函数。它让你能够读取命令行参数、操作模块搜索路径、与标准输入/输出流交互。
核心功能分类:
- 命令行参数 (
sys.argv): 获取脚本执行时传入的参数。 - 模块搜索路径 (
sys.path): 查看或修改 Python 查找模块的路径列表。 - 标准流 (
sys.stdin,sys.stdout,sys.stderr): 控制输入输出,可用于重定向。 - 程序退出 (
sys.exit()): 以指定的退出码结束程序。
3. 代码示例
3.1 使用 os 模块操作文件路径
import os
# 1. 路径拼接:这是最常用的操作,能自动处理不同操作系统的路径分隔符(如Windows的'\'和Linux的'/')
folder = 'my_folder'
filename = 'data.txt'
full_path = os.path.join(folder, filename)
print(f"完整路径: {full_path}") # 输出: my_folder/data.txt (Linux/macOS) 或 my_folder\data.txt (Windows)
# 2. 分割路径:获取路径的目录名和文件名
path = '/home/user/documents/report.pdf'
directory = os.path.dirname(path)
basename = os.path.basename(path)
print(f"目录: {directory}, 文件名: {basename}") # 输出: 目录: /home/user/documents, 文件名: report.pdf
# 3. 判断路径是否存在
print(os.path.exists(full_path)) # 通常输出 False,因为目录不存在
# 4. 判断是文件还是目录
print(os.path.isfile(__file__)) # 检查当前脚本是否为文件 (输出 True)
print(os.path.isdir('.')) # 检查当前目录是否为目录 (输出 True)
3.2 使用 os 模块管理目录和文件
import os
# 1. 创建目录
new_dir = 'test_directory'
os.makedirs(new_dir, exist_ok=True) # exist_ok=True 表示如果目录已存在也不会报错
print(f"目录 '{new_dir}' 已创建。")
# 2. 列出当前目录下的所有文件和文件夹
current_items = os.listdir('.')
print("当前目录内容:", current_items)
# 3. 遍历目录树(递归列出所有文件)
print("\n遍历目录树:")
for root, dirs, files in os.walk('.'):
level = root.replace('.', '').count(os.sep)
indent = ' ' * 2 * level
print(f"{indent}[目录] {os.path.basename(root)}/")
sub_indent = ' ' * 2 * (level + 1)
for file in files:
print(f"{sub_indent}{file}")
# 4. 删除文件和目录(谨慎操作!)
# file_to_remove = 'test_file.txt'
# if os.path.exists(file_to_remove):
# os.remove(file_to_remove) # 删除文件
# os.rmdir(new_dir) # 删除空目录
3.3 使用 sys 模块获取命令行参数
# 文件名: greet.py
import sys
# 1. 获取脚本名称和参数
# sys.argv 是一个列表,第一个元素是脚本名称,后面是传入的参数。
print("脚本名称:", sys.argv[0])
if len(sys.argv) > 1:
# 从第二个元素开始才是用户传入的参数
name = sys.argv[1]
print(f"你好, {name}!")
else:
print("用法: python greet.py [你的名字]")
sys.exit(1) # 使用非零退出码表示错误
3.4 使用 sys 模块查看系统路径
import sys
# 打印 Python 查找模块的路径列表
print("Python 模块搜索路径:")
for i, path in enumerate(sys.path):
print(f"{i}: {path}")
# 你也可以动态添加一个新的搜索路径
custom_module_path = '/path/to/your/custom/modules'
if custom_module_path not in sys.path:
sys.path.append(custom_module_path)
4. 实践练习
练习 1:创建目录结构(初级)
编写一个脚本,使用 os 模块在当前目录下创建一个名为 project 的目录,并在其内部创建子目录 src, docs 和 data。
要求:
- 确保即使目录已存在程序也不会报错。
- 打印出最终创建成功的目录结构。
预期输出:
成功创建目录: project
|- src
|- docs
|- data
练习 2:脚本参数处理器(中级)
扩展第3.3节的 greet.py 示例。编写一个脚本,接受两个命令行参数:一个名字和一个次数。
要求:
- 如果参数数量不对,打印用法说明并退出。
- 将名字重复打印指定次数,每行一次。
- 运行示例:
python greet_advanced.py Alice 3
预期输出(当运行 python greet_advanced.py Alice 3):
你好, Alice!
你好, Alice!
你好, Alice!
练习 3:文件查找器(综合)
编写一个命令行工具,接受一个文件扩展名(如 .txt)作为参数,然后使用 os.walk 在当前目录及其子目录中查找所有具有该扩展名的文件。
要求:
- 使用
sys.argv获取扩展名参数。 - 输出找到的每个文件的完整路径。
- 如果未找到任何文件,给出相应提示。
预期输出(当运行 python file_finder.py .txt):
正在查找 .txt 文件...
找到: ./notes.txt
找到: ./data/output.txt
找到: ./backup/old_notes.txt
共找到 3 个文件。
5. 常见错误
-
混淆
os和sys的用途: 初学者容易用错模块。记住:os主要用于文件系统和外部操作系统交互,而sys主要用于控制 Python 解释器自身。需要处理文件路径?用os。需要获取命令行参数?用sys。 -
忽略路径分隔符的跨平台问题: 手动拼接路径字符串(如
folder + '/' + filename)在 Windows 上会失败。务必使用os.path.join()来保证代码的跨平台兼容性。 -
使用
os.system()的安全风险: 虽然os.system('dir')可以执行命令,但它容易受到命令注入攻击(特别是当命令字符串来自用户输入时)。对于复杂的子进程操作,推荐使用更安全、更强大的subprocess模块。 -
在
sys.path中胡乱修改: 动态修改sys.path可能会导致模块导入混乱。通常只在脚本开头进行少量的、有明确目的的路径添加,并且使用绝对路径。 -
误删文件:
os.remove()和os.rmdir()是破坏性操作,且没有回收站。在调试删除功能时,务必在非重要目录下测试,或者先注释掉删除代码,只打印出将被删除的文件路径。
6. 小结
本课我们学习了 Python 标准库中两个强大的系统交互模块:
-
os模块 是处理文件系统的瑞士军刀。os.path.join()用于安全拼接路径,os.listdir()和os.walk()用于遍历目录,os.path.exists(),isfile(),isdir()用于检查路径状态。它是编写文件管理、自动化脚本的基础。 -
sys模块 让你的脚本能够与 Python 解释器"对话"。sys.argv让你接收外部输入,sys.path影响模块的查找,sys.exit()控制程序退出流程。它是编写命令行工具的必备模块。
关键要点: 合理运用这两个模块,可以极大增强 Python 脚本与操作系统交互的能力,是迈向编写实用系统工具和自动化脚本的重要一步。在后续课程中,我们将学习更多用于处理日期时间、网络通信等的标准库模块。