15·模块四:模块与包进阶

标准库之 os 与 sys 模块

standard-libraryossys

第 15 课:标准库之 os 与 sys 模块

1. 学习目标

通过本课学习,你将能够:

  • 掌握使用 os 模块进行常见的文件系统操作,如路径操作、目录遍历和文件属性查看。
  • 了解如何使用 os 模块执行跨平台的系统命令。
  • 理解 sys 模块的主要功能,包括获取命令行参数、操作 Python 运行时环境。
  • 能够结合 ossys 模块编写简单的系统管理或自动化脚本。

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, docsdata要求:

  • 确保即使目录已存在程序也不会报错。
  • 打印出最终创建成功的目录结构。

预期输出:

成功创建目录: 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. 常见错误

  1. 混淆 ossys 的用途: 初学者容易用错模块。记住:os 主要用于文件系统和外部操作系统交互,而 sys 主要用于控制 Python 解释器自身。需要处理文件路径?用 os。需要获取命令行参数?用 sys

  2. 忽略路径分隔符的跨平台问题: 手动拼接路径字符串(如 folder + '/' + filename)在 Windows 上会失败。务必使用 os.path.join() 来保证代码的跨平台兼容性。

  3. 使用 os.system() 的安全风险: 虽然 os.system('dir') 可以执行命令,但它容易受到命令注入攻击(特别是当命令字符串来自用户输入时)。对于复杂的子进程操作,推荐使用更安全、更强大的 subprocess 模块。

  4. sys.path 中胡乱修改: 动态修改 sys.path 可能会导致模块导入混乱。通常只在脚本开头进行少量的、有明确目的的路径添加,并且使用绝对路径。

  5. 误删文件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 脚本与操作系统交互的能力,是迈向编写实用系统工具和自动化脚本的重要一步。在后续课程中,我们将学习更多用于处理日期时间、网络通信等的标准库模块。

练习编辑器

python
Loading...

继续学习

完成本课后,建议继续学习下一课「标准库之 datetime 与 time 模块」 以巩固所学知识。