Langchain系列文章目录
01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
07-【深度解析】从GPT-1到GPT-4:ChatGPT背后的核心原理全揭秘
08-【万字长文】MCP深度解析:打通AI与世界的“USB-C”,模型上下文协议原理、实践与未来
Python系列文章目录
PyTorch系列文章目录
机器学习系列文章目录
深度学习系列文章目录
Java系列文章目录
JavaScript系列文章目录
Python系列文章目录
01-【Python-Day 1】告别编程恐惧:轻松掌握 Python 安装与第一个程序的 6 个步骤
02-【Python-Day 2】掌握Python基石:变量、内存、标识符及int/float/bool数据类型
03-【Python-Day 3】玩转文本:字符串(String)基础操作详解 (上)
04-【Python-Day 4】玩转文本:Python 字符串常用方法深度解析 (下篇)
05-【Python-Day 5】Python 格式化输出实战:%、format()、f-string 对比与最佳实践
06- 【Python-Day 6】从零精通 Python 运算符(上):算术、赋值与比较运算全解析
07-【Python-Day 7】从零精通 Python 运算符(下):逻辑、成员、身份运算与优先级规则全解析
08-【Python-Day 8】从入门到精通:Python 条件判断 if-elif-else 语句全解析
09-【Python-Day 9】掌握循环利器:for 循环遍历序列与可迭代对象详解
10-【Python-Day 10】Python 循环控制流:while 循环详解与 for 循环对比
11-【Python-Day 11】列表入门:Python 中最灵活的数据容器 (创建、索引、切片)
12-【Python-Day 12】Python列表进阶:玩转添加、删除、排序与列表推导式
13-【Python-Day 13】Python 元组 (Tuple) 详解:从创建、操作到高级应用场景一网打尽
14-【Python-Day 14】玩转Python字典(上篇):从零开始学习创建、访问与操作
15-【Python-Day 15】深入探索 Python 字典 (下):常用方法、遍历、推导式与嵌套实战
16-【Python-Day 16】代码复用基石:详解 Python 函数的定义与调用
17-【Python-Day 17】玩转函数参数(上):轻松掌握位置、关键字和默认值
18-【Python-Day 18】玩转函数参数(下):*args 与 **kwargs 终极指南
19-【Python-Day 19】函数的回响:深入理解 return
语句与返回值
20-【Python-Day 20】揭秘Python变量作用域:LEGB规则与global/nonlocal关键字详解
21-【Python-Day 21】一行搞定!Python lambda 匿名函数的妙用与实战
22-【Python-Day 22】代码的基石:模块(Module)的导入与使用详解
23-【Python-Day 23】Python 模块化编程实战:创建、导入及 sys.path 深度解析
24-【Python-Day 24】告别杂乱代码!一文掌握 Python 包(Package)的创建与使用
25-【Python-Day 25】玩转数字:精通 math 与 random 模块,从数学运算到随机抽样
26-【Python-Day 26】解锁时间魔法:深入解析 time 与 datetime 模块
27-【Python-Day 27】轻松驾驭操作系统:精通 os 与 sys 模块核心功能
前言
大家好!在前几篇文章中,我们学习了如何通过模块和包来组织和复用代码。今天,我们将踏入一个更广阔的领域——让我们的 Python 程序与计算机的操作系统及 Python 解释器本身进行直接对话。实现这一目标的两大神器,便是 Python 内置的 os
和 sys
模块。
os
模块是 Python 程序与操作系统之间的桥梁,无论你是想创建文件夹、删除文件,还是管理文件路径,它都能轻松搞定。而 sys
模块则是我们与 Python 解释器沟通的渠道,获取脚本运行时的参数、了解当前系统环境、甚至控制程序的退出,都离不开它。
掌握这两个模块,意味着你的 Python 技能将从单纯的“计算”和“数据处理”提升到“自动化脚本”和“系统级编程”的层次。无论是编写一个自动整理文件的工具,还是开发一个复杂的命令行应用,os
和 sys
都是你不可或缺的瑞士军刀。本文将带你系统地学习这两个模块的核心功能,并通过实战案例让你真正领悟它们的强大之处。
一、os
模块:与操作系统的桥梁
os
模块提供了一种方便的、跨平台的方式来使用操作系统的功能。当你的脚本需要与文件系统(目录、文件)进行交互时,os
模块就是你的首选。
1.1 什么是 os
模块?
简单来说,os
模块封装了不同操作系统的通用接口。比如,在 Windows 上删除文件的命令是 del
,在 Linux/macOS 上是 rm
。如果我们在 Python 代码里直接调用这些命令,代码就无法在不同系统上运行。而 os
模块提供了统一的函数,如 os.remove()
,它会在内部根据当前操作系统调用对应的指令,从而保证了我们代码的可移植性(Portability)。
1.2 路径与目录操作
目录(或称文件夹)是文件系统组织文件的基本单位。os
模块提供了丰富的函数来操作它们。
1.2.1 获取与更改当前工作目录
“当前工作目录”(Current Working Directory)是指程序当前正在操作的目录。所有相对路径(如 "data.txt"
)都是基于这个目录来解析的。
os.getcwd()
: 获取当前工作目录 (Get Current Working Directory)。os.chdir(path)
: 更改当前工作目录 (Change Directory)。
import os
# 1. 获取并打印当前工作目录
current_dir = os.getcwd()
print(f"当前的目录是: {current_dir}")
# 2. 尝试切换到一个不存在的目录(会报错)
try:
os.chdir("non_existent_folder")
except FileNotFoundError as e:
print(f"切换目录失败: {e}")
# 3. 假设在当前目录下有一个名为 'my_project' 的文件夹
# 我们先创建一个用于演示
if not os.path.exists("my_project"):
os.mkdir("my_project") # 如果不存在,就创建一个
# 4. 切换到 'my_project' 目录
os.chdir("my_project")
print(f"切换后的目录是: {os.getcwd()}")
# 演示结束后,切换回原来的目录并清理
os.chdir(current_dir)
os.rmdir("my_project")
print(f"已返回初始目录: {os.getcwd()}")
1.2.2 目录的创建与删除
自动化脚本常常需要根据需求创建或删除目录。
os.mkdir(path)
: 创建一个单层目录。如果父目录不存在,会抛出FileNotFoundError
。os.makedirs(path)
: 递归创建目录。如果中间的父目录不存在,它会自动创建。os.rmdir(path)
: 删除一个空目录。如果目录非空,会抛出OSError
。os.removedirs(path)
: 递归删除空目录。它会从最内层的目录开始,尝试删除,如果删除后父目录也变为空,则会继续删除父目录,以此类推。
import os
# 演示 mkdir 和 makedirs
project_path = "data/raw/2025"
single_dir = "temp_folder"
# 使用 mkdir 创建单层目录
print(f"尝试创建 '{single_dir}'...")
if not os.path.exists(single_dir):
os.mkdir(single_dir)
print(f"'{single_dir}' 创建成功!")
else:
print(f"'{single_dir}' 已存在。")
# 使用 makedirs 创建多层目录
print(f"尝试创建 '{project_path}'...")
if not os.path.exists(project_path):
os.makedirs(project_path)
print(f"'{project_path}' 及其父目录创建成功!")
else:
print(f"'{project_path}' 已存在。")
# 演示 rmdir 和 removedirs
print("\n开始清理...")
os.rmdir(single_dir)
print(f"'{single_dir}' 已被删除。")
os.removedirs(project_path)
print(f"'{project_path}' 已被递归删除。")
1.2.3 查看目录内容
os.listdir(path)
: 返回一个列表,包含指定路径下所有文件和目录的名称(不含.
和..
)。
import os
# 查看当前目录下的内容
# 为了演示,我们先创建一些文件和目录
os.makedirs("demo_dir/sub_dir", exist_ok=True)
with open("demo_dir/file1.txt", "w") as f:
f.write("hello")
with open("demo_dir/file2.log", "w") as f:
f.write("world")
# 列出 'demo_dir' 的内容
contents = os.listdir("demo_dir")
print(f"'demo_dir' 目录下的内容是: {contents}")
# 清理
os.remove("demo_dir/file1.txt")
os.remove("demo_dir/file2.log")
os.rmdir("demo_dir/sub_dir")
os.rmdir("demo_dir")
输出结果会是一个列表,如 ['sub_dir', 'file1.txt', 'file2.log']
(顺序可能不同)。
1.3 文件操作
虽然文件的读写主要通过 open()
函数完成,但 os
模块负责文件的重命名和删除。
os.rename(src, dst)
: 重命名文件或目录。src
是源路径,dst
是目标路径。这个函数也可以用来移动文件(如果src
和dst
在不同目录下)。os.remove(path)
: 删除一个文件。
import os
# 创建一个临时文件用于演示
original_name = "original.txt"
renamed_name = "renamed.txt"
with open(original_name, "w") as f:
f.write("This is a test file.")
print(f"文件 '{original_name}' 已创建。")
print(f"当前目录内容: {os.listdir('.')}")
# 重命名文件
os.rename(original_name, renamed_name)
print(f"文件已重命名为 '{renamed_name}'。")
print(f"当前目录内容: {os.listdir('.')}")
# 删除文件
os.remove(renamed_name)
print(f"文件 '{renamed_name}' 已删除。")
print(f"当前目录内容: {os.listdir('.')}")
1.4 os.path
子模块:路径处理专家
直接用字符串拼接路径(如 path + '/' + filename
)是不可靠的,因为 Windows 使用 \
作为路径分隔符,而 Linux/macOS 使用 /
。os.path
子模块解决了这个问题,让你的路径操作具备跨平台能力。
1.4.1 智能拼接路径 (os.path.join
)
这是 os.path
中最重要、最常用的函数。它会根据当前操作系统,使用正确的路径分隔符来拼接路径的各个部分。
import os
# 在 Windows 上,输出会是 'data\\images\\cat.png'
# 在 Linux/macOS 上,输出会是 'data/images/cat.png'
file_path = os.path.join("data", "images", "cat.png")
print(f"智能拼接的路径: {file_path}")
# 即使部分组件带有分隔符,它也能正确处理
path1 = "C:\\Users"
path2 = "guest\\Documents"
full_path = os.path.join(path1, path2)
print(f"处理带分隔符的拼接: {full_path}")
1.4.2 判断路径存在性 (os.path.exists
)
在对文件或目录进行操作前,检查它是否存在是一个好习惯。
os.path.exists(path)
: 如果路径path
存在,则返回True
,否则返回False
。
import os
if os.path.exists("C:\\Windows"): # 在 Windows 上通常为 True
print("Windows 目录存在!")
else:
print("Windows 目录不存在!")
if os.path.exists("/home"): # 在 Linux 上通常为 True
print("home 目录存在!")
else:
print("home 目录不存在!")
if not os.path.exists("a_fake_file.xyz"):
print("意料之中,a_fake_file.xyz 文件不存在。")
1.4.3 其他常用函数
os.path
还提供了许多其他有用的函数来解析和检查路径,下表总结了其中最常用的一些:
函数 | 功能描述 | 示例代码 |
---|---|---|
os.path.abspath(path) | 返回路径的绝对路径。 | os.path.abspath("file.txt") |
os.path.basename(path) | 返回路径的最后一部分(文件名或目录名)。 | os.path.basename("/usr/bin/python") -> 'python' |
os.path.dirname(path) | 返回路径的目录部分。 | os.path.dirname("/usr/bin/python") -> '/usr/bin' |
os.path.split(path) | 将路径分割成 (目录, 文件名) 的元组。 | os.path.split("/usr/bin/python") -> ('/usr/bin', 'python') |
os.path.isfile(path) | 如果路径是一个存在的文件,返回 True 。 | os.path.isfile("data.csv") |
os.path.isdir(path) | 如果路径是一个存在的目录,返回 True 。 | os.path.isdir("my_project/") |
二、sys
模块:Python 解释器的管家
如果说 os
模块是与“外部”的操作系统打交道,那么 sys
模块就是与“内部”的 Python 解释器环境进行交互。
2.1 什么是 sys
模块?
sys
模块让你能够访问由 Python 解释器使用或维护的变量,并可以调用与解释器强烈交互的函数。
2.2 获取命令行参数 (sys.argv
)
当你从命令行(如 Windows 的 cmd 或 PowerShell,macOS/Linux 的 Terminal)运行一个 Python 脚本时,可以向它传递一些参数。sys.argv
就是一个包含这些命令行参数的列表。
sys.argv[0]
永远是脚本自身的名称。sys.argv[1]
是第一个参数,sys.argv[2]
是第二个,以此类推。
示例:创建一个名为 show_args.py
的文件
# show_args.py
import sys
print(f"脚本名称: {sys.argv[0]}")
print(f"所有参数的列表: {sys.argv}")
print(f"参数总数: {len(sys.argv)}")
if len(sys.argv) > 1:
print(f"第一个参数是: {sys.argv[1]}")
print(f"第二个参数是: {sys.argv[2]}") # 如果只传一个参数,这里会报错
在命令行中运行它:
# 运行命令
python show_args.py user_profile --verbose 123
# 预期的输出
# 脚本名称: show_args.py
# 所有参数的列表: ['show_args.py', 'user_profile', '--verbose', '123']
# 参数总数: 4
# 第一个参数是: user_profile
# 第二个参数是: --verbose
注意:
sys.argv
中的所有元素都是字符串类型。如果参数是数字,你需要手动转换,例如int(sys.argv[2])
。
2.3 模块搜索路径 (sys.path
)
当执行 import my_module
时,Python 解释器去哪里查找 my_module.py
?答案就在 sys.path
中。它是一个列表,包含了所有模块的搜索路径。
import sys
import pprint # 使用 pprint 模块让输出更美观
print("Python 解释器会按照以下路径顺序查找模块:")
pprint.pprint(sys.path)
sys.path
的第一个元素通常是当前脚本所在的目录,这也是为什么你可以直接导入与主脚本放在同一文件夹下的其他 .py
文件。
2.4 获取平台信息 (sys.platform
)
这个属性返回一个标识当前操作系统的字符串,可以用来编写平台相关的代码。
- Windows:
'win32'
- Linux:
'linux'
- macOS:
'darwin'
import sys
import os
if sys.platform == "win32":
config_file = os.path.join(os.getenv("APPDATA"), "MyApp", "config.ini")
print(f"Windows 平台,配置文件路径: {config_file}")
elif sys.platform == "darwin":
config_file = os.path.join(os.path.expanduser("~"), "Library", "Application Support", "MyApp", "config.ini")
print(f"macOS 平台,配置文件路径: {config_file}")
elif sys.platform.startswith("linux"):
config_file = os.path.join(os.path.expanduser("~"), ".config", "MyApp", "config.ini")
print(f"Linux 平台,配置文件路径: {config_file}")
else:
print(f"未知的平台: {sys.platform}")
2.5 退出程序 (sys.exit
)
sys.exit()
函数可以用来中断程序的执行。你可以提供一个可选的整数作为退出状态码,通常 0
表示成功退出,非 0
值表示发生了错误。这对于自动化脚本非常有用。
import sys
def check_age(age_str):
try:
age = int(age_str)
if age < 18:
print("错误:用户未成年。")
sys.exit(1) # 以错误码 1 退出
else:
print("年龄验证通过。")
except ValueError:
print("错误:请输入一个有效的数字年龄。")
sys.exit(2) # 以错误码 2 退出
# 模拟命令行输入
# check_age(sys.argv[1])
check_age("25")
check_age("15") # 这行会使程序退出,后面的代码不会执行
三、os
与 sys
的协同应用场景
os
和 sys
模块的真正威力体现在它们协同工作时。下面我们来看一个常见的实际应用场景。
3.1 场景:批量重命名指定目录下的文件
目标:编写一个脚本,该脚本接收一个目录路径作为命令行参数。脚本会进入该目录,并将其中所有 .txt
后缀的文件重命名,在原文件名前加上 prefix_
的前缀。
代码实现 (batch_rename.py
):
# batch_rename.py
import os
import sys
def batch_rename_txt_files(target_dir, prefix="prefix_"):
"""
在指定目录中,为所有 .txt 文件添加前缀。
"""
# 1. 检查路径有效性
if not os.path.isdir(target_dir):
print(f"错误: '{target_dir}' 不是一个有效的目录。")
sys.exit(1)
print(f"目标目录: {target_dir}")
print(f"将要添加的前缀: '{prefix}'")
try:
# 2. 获取文件列表
all_files = os.listdir(target_dir)
renamed_count = 0
# 3. 遍历并重命名
for filename in all_files:
# 检查是否是文件且以 .txt 结尾
full_path = os.path.join(target_dir, filename)
if os.path.isfile(full_path) and filename.lower().endswith(".txt"):
# 构造新的文件名
new_filename = f"{prefix}{filename}"
old_filepath = os.path.join(target_dir, filename)
new_filepath = os.path.join(target_dir, new_filename)
# 执行重命名
os.rename(old_filepath, new_filepath)
print(f" '{filename}' -> '{new_filename}'")
renamed_count += 1
print(f"\n操作完成!总共重命名了 {renamed_count} 个文件。")
except OSError as e:
print(f"操作失败,发生错误: {e}")
sys.exit(1)
if __name__ == "__main__":
# 4. 从命令行获取参数
if len(sys.argv) != 2:
print("用法: python batch_rename.py <目录路径>")
# sys.argv[0] 是脚本名, sys.argv[1] 是第一个参数
sys.exit(1)
directory_to_process = sys.argv[1]
batch_rename_txt_files(directory_to_process)
如何使用:
- 创建一个测试目录,例如
my_docs
。 - 在
my_docs
目录里创建几个.txt
文件,如report.txt
,notes.txt
和一个非txt文件image.jpg
。 - 在命令行中运行脚本,将
my_docs
作为参数传入:python batch_rename.py my_docs
- 脚本执行后,
my_docs
目录下的文件将被重命名为prefix_report.txt
和prefix_notes.txt
,而image.jpg
保持不变。
这个例子完美地展示了 sys
如何获取用户输入(目录路径),而 os
和 os.path
如何执行实际的文件系统操作。
四、总结
恭喜你,又掌握了 Python 中两件强大的工具!通过今天的学习,我们解锁了与计算机系统底层交互的能力。让我们回顾一下核心知识点:
-
os
模块:是 Python 与操作系统交互的接口。核心功能包括目录操作(getcwd
,chdir
,mkdir
,rmdir
,listdir
)和文件操作(rename
,remove
)。它是实现文件管理自动化的基础。 -
sys
模块:是 Python 与解释器环境沟通的桥梁。核心功能包括获取命令行参数(sys.argv
)、查看模块搜索路径(sys.path
)、识别操作系统平台(sys.platform
)以及控制程序退出(sys.exit
)。 -
os.path
子模块:是处理文件路径的专家,其最重要的函数是os.path.join()
,它能确保你的路径拼接代码在所有操作系统上都能正确工作,大大增强了代码的可移植性。 -
协同作战:
os
和sys
经常结合使用,以创建强大的命令行工具和自动化脚本。sys
负责从外部环境(如命令行)获取指令和信息,os
负责根据这些指令执行具体的文件系统任务。 -
实践出真知:本文介绍的函数只是冰山一角。强烈建议你亲自动手,尝试
os
和sys
模块中的其他函数,创建自己的小工具,例如一个能自动分类下载文件夹中文件的脚本,或者一个能清理指定类型临时文件的程序。在实践中,你将对它们有更深刻的理解。