文章目录
- 函数 描述 示例 输出示例 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')
- 函数 描述 示例 注意 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") 从最深层开始向上删除
- 函数 描述 示例 注意 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)) 时间戳为秒数
- 函数 描述 示例 注意 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 支持有限
- 函数/属性 描述 示例 注意 os.environ 字典形式的环境变量 os.environ["PATH"] 修改后仅影响当前进程 os.getenv(key, default) 获取环境变量值 os.getenv("HOME", "/tmp") 键不存在时返回 default os.putenv(key, value) 设置环境变量(不推荐) os.putenv("DEBUG", "1") 建议直接操作 os.environ
- 函数/属性 描述 示例 输出示例 os.name 操作系统名称 print(os.name) posix(Linux/macOS)nt(Windows) os.sep 路径分隔符 os.sep / 或 os.linesep 行终止符 os.linesep n(Linux)rn(Windows) os.cpu_count() 返回 CPU 核心数 os.cpu_count() 8
- 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}”)
- 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) )
- import tempfile def create_temp_dir(): temp_dir = tempfile.mkdtemp() try: print(f”临时目录已创建: {temp_dir}”) # 执行操作… finally: os.rmdir(temp_dir) print(“临时目录已删除”)
- 不要手动拼接路径:使用 os.path.join() 替代字符串拼接,避免跨平台问题: # 错误方式 path = “dir” + “/” + “file.txt” # 在Windows下失效 # 正确方式 path = os.path.join(“dir”, “file.txt”)
- 文件操作需捕获常见异常: try: os.remove(“non_exist.txt”) except FileNotFoundError as e: print(f”文件不存在: {e}”)
- 谨慎使用 os.system():可能引发命令注入漏洞,优先使用 subprocess.run(): # 危险!用户输入可能包含恶意命令 user_input = “some; rm -rf /” os.system(f”echo {user_input}”) # 安全方式 import subprocess subprocess.run([“echo”, user_input], check=True)
- 检查系统差异: if os.name == ‘posix’: print(“运行在 Unix-like 系统”) elif os.name == ‘nt’: print(“运行在 Windows 系统”)
目录
- 一、os 库概述
- 二、常用功能分类详解
- 1. 路径操作(os.path 模块)
- 2. 目录管理
- 3. 文件操作
- 4. 进程管理
- 5. 环境变量管理
- 6. 系统信息
- 三、实际应用示例
- 1. 递归遍历目录
- ①、核心功能与运行机制
- ②、参数详解
- ③、返回值解析
- 2. 批量重命名文件
- 3. 安全创建临时目录
- 四、注意事项
- 1. 路径处理
- 2. 异常处理
- 3. 安全性
- 4. 跨平台兼容性
- 五、与 shutil 库的对比
- 功能:提供与操作系统交互的接口,包括文件管理、环境变量、进程控制、路径操作等。
- 跨平台特性:大部分函数支持 Windows、Linux、macOS,但部分功能存在系统差异。
- 核心模块:
os:基础操作系统接口
os.path:路径处理工具
- 导入方式:
import os
os:基础操作系统接口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') |
| 函数 | 描述 | 示例 | 注意 |
|---|---|---|---|
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") |
从最深层开始向上删除 |
| 函数 | 描述 | 示例 | 注意 |
|---|---|---|---|
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)) |
时间戳为秒数 |
| 函数 | 描述 | 示例 | 注意 |
|---|---|---|---|
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 支持有限 |
| 函数/属性 | 描述 | 示例 | 注意 |
|---|---|---|---|
os.environ |
字典形式的环境变量 | os.environ["PATH"] |
修改后仅影响当前进程 |
os.getenv(key, default) |
获取环境变量值 | os.getenv("HOME", "/tmp") |
键不存在时返回 default |
os.putenv(key, value) |
设置环境变量(不推荐) | os.putenv("DEBUG", "1") |
建议直接操作 os.environ |
| 函数/属性 | 描述 | 示例 | 输出示例 |
|---|---|---|---|
os.name |
操作系统名称 | print(os.name) |
posix(Linux/macOS)nt(Windows) |
os.sep |
路径分隔符 | os.sep |
/ 或 |
os.linesep |
行终止符 | os.linesep |
n(Linux)rn(Windows) |
os.cpu_count() |
返回 CPU 核心数 | os.cpu_count() |
8 |
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),避免一次性加载所有路径导致内存压力。
目录树遍历以 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}")
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)
)
import tempfile
def create_temp_dir():
temp_dir = tempfile.mkdtemp()
try:
print(f"临时目录已创建: {temp_dir}")
# 执行操作...
finally:
os.rmdir(temp_dir)
print("临时目录已删除")
- 不要手动拼接路径:使用
os.path.join() 替代字符串拼接,避免跨平台问题:
# 错误方式
path = "dir" + "/" + "file.txt" # 在Windows下失效
# 正确方式
path = os.path.join("dir", "file.txt")
os.path.join() 替代字符串拼接,避免跨平台问题:
- 文件操作需捕获常见异常:
try:
os.remove("non_exist.txt")
except FileNotFoundError as e:
print(f"文件不存在: {e}")
- 谨慎使用 os.system():可能引发命令注入漏洞,优先使用
subprocess.run():
# 危险!用户输入可能包含恶意命令
user_input = "some; rm -rf /"
os.system(f"echo {user_input}")
# 安全方式
import subprocess
subprocess.run(["echo", user_input], check=True)
subprocess.run():
- 检查系统差异:
if os.name == 'posix':
print("运行在 Unix-like 系统")
elif os.name == 'nt':
print("运行在 Windows 系统")
| 功能 | os 库 |
shutil 库 |
|---|---|---|
| 文件复制 | ❌ 无直接支持 | ✅ shutil.copy() |
| 目录删除 | ✅ 只能删空目录 | ✅ shutil.rmtree() 递归删除 |
| 压缩文件 | ❌ 无支持 | ✅ shutil.make_archive() |
| 元数据保留 | ❌ 需手动处理 | ✅ copystat() 保留权限和时间 |
到此这篇关于Python中-os库用法介绍的文章就介绍到这了,更多相关Python -os库介绍内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
您可能感兴趣的文章:
- python标准库os库的函数介绍
- Python标准库os库的常用功能解析
- Python第三方库OS库方法实操
- Python os库常用操作代码汇总
- python os库使用示例教程
- python中os库的具体使用
- 总结归纳python os库常用方法
- python中os库的函数使用