Python中os库功能全面解析与介绍
一、os
库概述
os
:基础操作系统接口os.path
:路径处理工具import os
二、常用功能分类详解
1. 路径操作(os.path
模块)
函数 | 描述 | 示例 | 输出示例 |
---|---|---|---|
os.path.abspath(path) |
返回绝对路径 | os.path.abspath("test.txt") |
/home/user/test.txt |
os.path.dirname(path) |
返回路径的目录部分 | os.path.dirname("/a/b/c.txt") |
/a/b |
os.path.basename(path) |
返回路径的文件名部分 | os.path.basename("/a/b/c.txt") |
c.txt |
os.path.join(path1, path2) |
智能拼接路径(跨平台安全) | os.path.join("dir", "file.txt") |
dir/file.txt |
os.path.exists(path) |
检查路径是否存在 | os.path.exists("test.txt") |
True /False |
os.path.isfile(path) |
检查是否为文件 | os.path.isfile("test.txt") |
True |
os.path.isdir(path) |
检查是否为目录 | os.path.isdir("docs") |
True |
os.path.getsize(path) |
获取文件大小(字节) | os.path.getsize("test.txt") |
1024 |
os.path.splitext(path) |
分割文件名和扩展名 | os.path.splitext("file.txt") |
('file', '.txt') |
2. 目录管理
函数 | 描述 | 示例 | 注意 |
---|---|---|---|
os.getcwd() |
获取当前工作目录 | print(os.getcwd()) |
返回绝对路径 |
os.chdir(path) |
切换当前工作目录 | os.chdir("..") |
失败抛出 FileNotFoundError |
os.listdir(path=".") |
列出目录内容 | os.listdir("/tmp") |
返回文件名列表(不递归) |
os.mkdir(path) |
创建单层目录 | os.mkdir("new_dir") |
目录已存在时抛出 FileExistsError |
os.makedirs(path) |
递归创建多层目录 | os.makedirs("a/b/c") |
类似 mkdir -p |
os.rmdir(path) |
删除空目录 | os.rmdir("empty_dir") |
目录非空时抛出 OSError |
os.removedirs(path) |
递归删除空目录 | os.removedirs("a/b/c") |
从最深层开始向上删除 |
3. 文件操作
函数 | 描述 | 示例 | 注意 |
---|---|---|---|
os.remove(path) |
删除文件 | os.remove("temp.txt") |
文件不存在时抛出 FileNotFoundError |
os.rename(src, dst) |
重命名/移动文件或目录 | os.rename("old.txt", "new.txt") |
跨磁盘移动可能失败 |
os.stat(path) |
获取文件状态信息 | st = os.stat("file.txt") st.st_size |
返回包含大小、时间等的对象 |
os.utime(path, times) |
修改文件访问/修改时间 | os.utime("file.txt", (atime, mtime)) |
时间戳为秒数 |
4. 进程管理
函数 | 描述 | 示例 | 注意 |
---|---|---|---|
os.system(command) |
执行系统命令 | os.system("ls -l") |
返回命令退出状态码 |
os.popen(command) |
执行命令并获取输出(已废弃) | output = os.popen("date").read() |
建议改用 subprocess |
os.exec*() 系列 |
替换当前进程(如 os.execlp ) |
os.execlp("python", "python", "script.py") |
执行后原进程终止 |
os.kill(pid, signal) |
向进程发送信号 | os.kill(pid, signal.SIGTERM) |
Windows 支持有限 |
5. 环境变量管理
函数/属性 | 描述 | 示例 | 注意 |
---|---|---|---|
os.environ |
字典形式的环境变量 | os.environ["PATH"] |
修改后仅影响当前进程 |
os.getenv(key, default) |
获取环境变量值 | os.getenv("HOME", "/tmp") |
键不存在时返回 default |
os.putenv(key, value) |
设置环境变量(不推荐) | os.putenv("DEBUG", "1") |
建议直接操作 os.environ |
6. 系统信息
函数/属性 | 描述 | 示例 | 输出示例 |
---|---|---|---|
os.name |
操作系统名称 | print(os.name) |
posix (Linux/macOS)nt (Windows) |
os.sep |
路径分隔符 | os.sep |
/ 或 \ |
os.linesep |
行终止符 | os.linesep |
\n (Linux)\r\n (Windows) |
os.cpu_count() |
返回 CPU 核心数 | os.cpu_count() |
8 |
三、实际应用示例
1. 递归遍历目录
def list_files(startpath):
for root, dirs, files in os.walk(startpath):
level = root.replace(startpath, '').count(os.sep)
indent = ' ' * 4 * level
print(f"{indent}{os.path.basename(root)}/")
subindent = ' ' * 4 * (level + 1)
for f in files:
print(f"{subindent}{f}")
list_files("/tmp")
os.walk(path)
是 Python 中用于递归遍历目录结构的核心函数,可深度遍历指定路径下的所有子目录和文件。以下从功能、参数、返回值到应用场景的全面解析:
①、核心功能与运行机制
-
目录树遍历
以path
为根目录,逐层遍历所有子目录,生成目录树的完整结构。支持 深度优先 或 广度优先 遍历(通过topdown
参数控制)。 -
数据生成方式
返回一个 生成器(generator),按需生成三元组(root, dirs, files)
,避免一次性加载所有路径导致内存压力。
②、参数详解
python
os.walk(top, topdown=True, onerror=None, followlinks=False)
参数 | 类型 | 作用 |
---|---|---|
top |
str |
要遍历的根目录路径 |
topdown |
bool |
默认 True :先返回父目录再子目录;False 则逆序(从叶子节点向上) |
onerror |
callable |
遍历出错时的回调函数(接收异常对象作为参数) |
followlinks |
bool |
是否追踪符号链接指向的真实目录(默认 False ) |
③、返回值解析
每次迭代返回的三元组包含:
- **
root
**
当前遍历的目录绝对路径(如"/data/images/cats"
)。 - **
dirs
**
当前目录下的 直接子目录名列表(不含路径,如["2023", "2024"]
)。 - **
files
**
当前目录下的 文件名列表(不含路径,如["cat1.jpg", "cat2.png"]
)。
示例目录结构:
markdown
root/
├── dir1/
│ ├── file1.txt
│ └── subdir/
└── dir2/
└── file2.log
对应的遍历输出:
python
# 第一次迭代
('root', ['dir1', 'dir2'], [])
# 第二次迭代(进入 dir1)
('root/dir1', ['subdir'], ['file1.txt'])
# 第三次迭代(进入 subdir)
('root/dir1/subdir', [], [])
# 第四次迭代(进入 dir2)
('root/dir2', [], ['file2.log'])
遍历所有文件并获取完整路径
python
import os
for root, dirs, files in os.walk("data"):
for file in files:
full_path = os.path.join(root, file) # 拼接完整路径[3,6](@ref)
print(f"发现文件:{full_path}")
2. 批量重命名文件
folder = "docs"
for filename in os.listdir(folder):
if filename.endswith(".txt"):
new_name = filename.replace(" ", "_")
os.rename(
os.path.join(folder, filename),
os.path.join(folder, new_name)
)
3. 安全创建临时目录
import tempfile
def create_temp_dir():
temp_dir = tempfile.mkdtemp()
try:
print(f"临时目录已创建: {temp_dir}")
# 执行操作...
finally:
os.rmdir(temp_dir)
print("临时目录已删除")
四、注意事项
1. 路径处理
os.path.join()
替代字符串拼接,避免跨平台问题:# 错误方式
path = "dir" + "/" + "file.txt" # 在Windows下失效
# 正确方式
path = os.path.join("dir", "file.txt")
2. 异常处理
try:
os.remove("non_exist.txt")
except FileNotFoundError as e:
print(f"文件不存在: {e}")
3. 安全性
os.system()
:可能引发命令注入漏洞,优先使用 subprocess.run()
:# 危险!用户输入可能包含恶意命令
user_input = "some; rm -rf /"
os.system(f"echo {user_input}")
# 安全方式
import subprocess
subprocess.run(["echo", user_input], check=True)
4. 跨平台兼容性
if os.name == 'posix':
print("运行在 Unix-like 系统")
elif os.name == 'nt':
print("运行在 Windows 系统")
五、与 shutil
库的对比
功能 | os 库 |
shutil 库 |
---|---|---|
文件复制 | ❌ 无直接支持 | ✅ shutil.copy() |
目录删除 | ✅ 只能删空目录 | ✅ shutil.rmtree() 递归删除 |
压缩文件 | ❌ 无支持 | ✅ shutil.make_archive() |
元数据保留 | ❌ 需手动处理 | ✅ copystat() 保留权限和时间 |
作者:wanglaqqqq