pin_drop当前位置:知识文库 ❯ 图文
os.path.basename与dirname详解 - Python提取文件名目录名教程
一、os.path.basename() 与 os.path.dirname() 概述
在文件路径处理中,os.path.basename() 和 os.path.dirname() 是一对非常实用的函数。它们分别是 os.path.split() 的便捷封装:
-
os.path.basename():返回路径中的文件名部分(即最后一级)
-
os.path.dirname():返回路径中的目录部分(即去掉最后一级的剩余部分)
这两个函数在日常开发中频繁使用,尤其在文件批量处理、路径构建和日志记录等场景中不可或缺。
二、语法与参数说明
语法
代码示例
os.path.basename(path)
os.path.dirname(path)参数说明
返回值
-
basename():返回路径最后的文件名部分
-
dirname():返回路径的目录部分
三、代码示例详解
示例 1:提取文件名和目录名
代码示例
import os
paths = [
'/home/user/docs/report.txt',
'src/main.py',
'config.ini',
'/tmp/',
'/',
]
for p in paths:
print(f"路径: {p}")
print(f" 目录: '{os.path.dirname(p)}'")
print(f" 文件名: '{os.path.basename(p)}'")输出结果:
代码示例
路径: /home/user/docs/report.txt
目录: '/home/user/docs'
文件名: 'report.txt'
路径: src/main.py
目录: 'src'
文件名: 'main.py'
路径: config.ini
目录: ''
文件名: 'config.ini'
路径: /tmp/
目录: '/tmp'
文件名: ''
路径: /
目录: '/'
文件名: ''示例 2:在文件处理中使用 basename 和 dirname
在实际开发中,我们通常需要同时提取目录、文件名、纯文件名和扩展名,然后进行路径拼接操作:
代码示例
import os
filepath = '/project/data/output/result_2025.csv'
dirname = os.path.dirname(filepath)
basename = os.path.basename(filepath)
name, ext = os.path.splitext(basename)
print(f"完整路径: {filepath}")
print(f"所在目录: {dirname}")
print(f"完整文件名: {basename}")
print(f"纯文件名: {name}")
print(f"扩展名: {ext}")
new_path = os.path.join(dirname, f"{name}_backup{ext}")
print(f"备份路径: {new_path}")输出结果:
代码示例
完整路径: /project/data/output/result_2025.csv
所在目录: /project/data/output
完整文件名: result_2025.csv
纯文件名: result_2025
扩展名: .csv
备份路径: /project/data/output\result_2025_backup.csv示例 3:批量处理文件名,提取上级目录名
代码示例
import os
files = [
'/photos/vacation/beach_001.jpg',
'/photos/vacation/beach_002.jpg',
'/photos/vacation/sunset.png',
]
for f in files:
folder = os.path.basename(os.path.dirname(f))
name = os.path.basename(f)
print(f"[{folder}] {name}")输出结果:
代码示例
[vacation] beach_001.jpg
[vacation] beach_002.jpg
[vacation] sunset.png四、实际应用场景
场景 1:文件上传中从完整路径提取文件名
在 Web 应用中,浏览器上传文件时可能携带客户端的完整路径。使用 os.path.basename() 可以提取纯文件名,避免暴露用户目录结构。
场景 2:路径构建中获取父目录后拼接新路径
在创建备份文件、日志文件或临时文件时,通常需要在原文件的同一目录下创建新文件。使用 os.path.dirname() 获取父目录后,通过 os.path.join() 拼接新文件名。
场景 3:日志记录中提取脚本文件名作为标识
在日志系统中,经常需要在日志条目中标记触发日志的源文件。通过 os.path.basename(__file__) 可以简洁地获取当前脚本的文件名。
五、注意事项
注意 1:
os.path.basename()等价于os.path.split(path)[1]。
注意 2:
os.path.dirname()等价于os.path.split(path)[0]。
注意 3:以分隔符结尾的路径(如
/tmp/),basename()返回空字符串。
小贴士
如果你同时需要目录和文件名两个部分,直接使用 os.path.split() 一次调用比分别调用 dirname() 和 basename() 更高效,因为前者只解析一次路径字符串。
六、常见问题 FAQ
常见问题
os.path.basename() 能提取目录名吗?
可以。当路径指向一个目录时(如 /home/user/docs),os.path.basename() 返回的是最后一级目录名(如 docs)。它不区分路径指向的是文件还是目录,只返回最后一部分。
basename 和 dirname 与 split 的性能差异?
basename() 和 dirname() 内部都会调用一次 split()。如果你同时需要目录和文件名,直接调用 split() 一次即可,避免重复解析路径。但如果只需要其中一个部分,使用对应的便捷函数更简洁。
如何处理路径中的尾部斜杠?
以分隔符结尾的路径(如 /tmp/),其 basename 会返回空字符串。如果希望获得尾部目录名,可以先用 os.path.normpath() 去除尾部斜杠,再调用 basename()。
推荐使用 os.path 还是 pathlib 来获取文件名和目录?
对于 Python 3.4+ 的新项目,推荐使用 pathlib.Path,其 .name 属性等价于 os.path.basename(),.parent 属性等价于 os.path.dirname()。但 os.path 在老项目和简单场景中仍然广泛使用。
七、练习题
练习 1
编写程序,输入文件路径,输出其所在目录、文件名和纯文件名(不含扩展名)。
练习 2
编写函数,将文件路径中的文件名替换为新文件名,保持目录不变。例如输入 /data/old.txt 和 new.csv,返回 /data/new.csv。
本文涉及AI创作
内容由AI创作,请仔细甄别