一、os 库概述
- 功能:提供与操作系统交互的接口,包括文件管理、环境变量、进程控制、路径操作等。
- 跨平台特性:大部分函数支持 windows、linux、macos,但部分功能存在系统差异。
- 核心模块:
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() 保留权限和时间 |
到此这篇关于python中-os库用法介绍的文章就介绍到这了,更多相关python -os库介绍内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论