os详解,从上面是‘os‘模块?到核心组成和常用函数
一.什么是 os
模块?
os
模块是 “Operating System”(操作系统)的缩写。它提供了一种方便的、可移植的方式来使用操作系统的功能。简单来说,Python 通过 os
模块充当了你和操作系统之间的桥梁,让你能够用 Python 代码来执行原本需要在命令行(如 Windows 的 cmd 或 Linux/macOS 的 Terminal)中才能完成的各种系统级任务。
这些任务主要包括:
- 文件和目录操作(创建、删除、重命名、遍历)
- 文件路径处理(拼接、分割、获取路径信息)
- 读取和设置环境变量
- 执行系统命令
- 管理进程
os
模块最大的优点之一是跨平台性。它会帮你处理好不同操作系统(如 Windows, macOS, Linux)之间的差异。例如,Windows 的路径分隔符是 \
,而 Linux/macOS 是 /
。如果你使用 os.path.join()
来拼接路径,它会自动使用当前操作系统对应的正确分隔符,让你的代码无需修改就能在不同系统上运行。
二.核心组成部分与常用函数
os
模块功能非常丰富,我们将其分为几个核心类别来讲解,并附上代码示例。
1. 路径操作 (os.path
)
这是 os
模块中最常用、最重要的子模块,专门用于处理文件和目录的路径字符串。
-
os.path.join(path, *paths)
:智能拼接路径
这是拼接路径的首选方式,因为它会自动处理不同操作系统的路径分隔符。import os# 在 Windows 上,结果是 'data\\images\\cat.png' # 在 Linux/macOS 上,结果是 'data/images/cat.png' full_path = os.path.join('data', 'images', 'cat.png') print(full_path)# 避免使用字符串拼接,因为不具备跨平台性 # bad_path = 'data' + '/' + 'images' + '/' + 'cat.png' # 在 Windows 上可能出问题
-
os.path.exists(path)
:检查路径是否存在
检查一个文件或目录是否存在,返回True
或False
。import os print(os.path.exists('C:/Users')) # 在 Windows 上很可能返回 True print(os.path.exists('./non_existent_file.txt')) # 返回 False
-
os.path.isfile(path)
和os.path.isdir(path)
:判断是文件还是目录import os # 假设当前目录下有一个名为 my_script.py 的文件和一个名为 data 的文件夹 print(os.path.isfile('my_script.py')) # 返回 True print(os.path.isdir('my_script.py')) # 返回 False print(os.path.isdir('data')) # 返回 True
-
os.path.split(path)
和os.path.splitext(path)
:拆分路径split()
:将路径拆分为(目录部分, 文件名部分)
。splitext()
:将路径拆分为(文件名主干, 扩展名)
。
import os path = '/home/user/project/main.py'dir_part, file_part = os.path.split(path) print(f"目录部分: {dir_part}") # 输出: /home/user/project print(f"文件名部分: {file_part}") # 输出: main.pyroot, extension = os.path.splitext(path) print(f"文件名主干: {root}") # 输出: /home/user/project/main print(f"扩展名: {extension}") # 输出: .py
-
os.path.basename(path)
和os.path.dirname(path)
:获取文件名和目录名import os path = '/home/user/project/main.py' print(f"文件名: {os.path.basename(path)}") # 输出: main.py print(f"目录名: {os.path.dirname(path)}") # 输出: /home/user/project
2. 目录与文件操作
这类函数直接对文件系统进行操作。
-
os.getcwd()
:获取当前工作目录 (Get Current Working Directory)import os current_dir = os.getcwd() print(f"当前工作目录是: {current_dir}")
-
os.chdir(path)
:改变当前工作目录 (Change Directory)import os # 切换到 C 盘根目录 (Windows 示例) # os.chdir('C:\\') # print(os.getcwd())
-
os.listdir(path)
:列出目录中的所有文件和文件夹
返回一个包含目录下所有条目名称的列表。import os # 列出当前目录下的内容 items = os.listdir('.') # '.' 代表当前目录 print(items)
-
os.mkdir(path)
和os.makedirs(path)
:创建目录mkdir()
:只能创建单层目录。如果父目录不存在,会报错。makedirs()
:可以创建多层嵌套的目录(递归创建)。如果目录已存在,可以通过exist_ok=True
参数避免报错。
import os # 创建单层目录 if not os.path.exists('single_dir'):os.mkdir('single_dir')# 创建多层目录,更推荐的方式 os.makedirs('nested/deep/dir', exist_ok=True)
-
os.remove(path)
或os.unlink(path)
:删除文件
这两个函数功能相同。如果路径是目录,会报错。# 假设有一个名为 temp.txt 的文件 # if os.path.exists('temp.txt'): # os.remove('temp.txt')
-
os.rmdir(path)
和os.removedirs(path)
:删除目录rmdir()
:只能删除空目录。removedirs()
:递归删除空目录。
# 假设有一个名为 single_dir 的空目录 # if os.path.exists('single_dir'): # os.rmdir('single_dir')
-
os.rename(src, dst)
:重命名或移动文件/目录
如果src
(源) 和dst
(目标) 在同一个目录下,就是重命名。如果在不同目录下,就是移动。import os # 创建一个文件用于演示 with open('old_name.txt', 'w') as f:f.write('hello')# 重命名 os.rename('old_name.txt', 'new_name.txt')# 移动文件 os.makedirs('storage', exist_ok=True) os.rename('new_name.txt', os.path.join('storage', 'moved_file.txt'))
3. 环境变量
-
os.environ
:获取所有环境变量
它表现得像一个 Python 字典,包含了所有的环境变量。import os # 获取所有环境变量 # print(os.environ)# 获取单个环境变量,比如 'PATH' path_variable = os.environ.get('PATH') # 使用 .get() 更安全,如果不存在返回 None print(f"PATH 环境变量的一部分: {path_variable[:30]}...")
-
os.getenv(key, default=None)
:安全地获取环境变量
推荐使用此函数,因为它在环境变量不存在时不会报错,而是返回None
或你指定的默认值。import os api_key = os.getenv('MY_API_KEY', 'default_key') print(f"API Key: {api_key}")
4. 执行系统命令
-
os.system(command)
:在子 shell 中执行命令
这会打开一个操作系统的 shell 来执行命令,并将命令的输出直接打印到控制台。它只返回命令的退出状态码(通常 0 表示成功)。import os # 在 Linux/macOS 上 # os.system('ls -l')# 在 Windows 上 # os.system('dir')
注意:
os.system()
的功能相对简单,并且存在安全风险(命令注入)。在现代 Python 开发中,更推荐使用功能更强大、更安全的subprocess
模块来执行外部命令。
三.总结
os
模块是 Python 与操作系统交互的基石。掌握它的核心功能,特别是 os.path
子模块以及文件/目录操作函数,是进行任何涉及文件系统自动化的 Python 编程的必备技能。同时,了解并适时使用 pathlib
会让你的路径处理代码更加优雅和现代化。