HOWTO · Python
在 Python 中从路径中获取目录
本教程演示如何在 Python 中提取文件路径的一部分。
本页内容
要从文件路径获取父目录,可以将路径传给 os.path.dirname()。如果希望使用面向对象的方式,也可以通过 pathlib 中的 Path(file_path).parent 获取父目录。这两种方式返回的都是包含该文件的目录;它们不会返回进程的当前工作目录。
示例使用正斜杠路径,以便结果更易阅读。Python 的路径函数会按照运行所在操作系统的规则解释路径。需要组合多个独立路径片段时,请使用 os.path.join() 或 pathlib 构建路径,而不要手动插入分隔符。
了解路径分隔符
路径会使用特定于平台的分隔符来分隔目录名和最后一个路径部分。POSIX 系统通常使用 /;Windows 路径通常使用 \\,并且在许多路径操作中也接受 /。os.sep 可以获取当前平台使用的分隔符。处理常见路径时,直接将路径传给 os.path 或使用 pathlib 即可,无需自行判断分隔符。
使用 os.path.basename 获取文件名
os.path.basename() 会返回路径的最后一个部分。对于文件路径,这通常是包含扩展名的文件名,而不是目录。如果要从文件路径中获取最后一级目录名,可以先用 os.path.dirname() 获取其父目录,再将结果传给 os.path.basename()。
import os
file_path = "/home/user/documents/report.txt"
filename = os.path.basename(file_path)
parent_directory = os.path.dirname(file_path)
last_directory = os.path.basename(parent_directory)
print(filename)
print(last_directory)
report.txt
documents
使用 os.path.splitext 分离文件名和扩展名
os.path.splitext() 会从路径的最后一个部分中分离扩展名,并返回一个 (root, ext) 元组。扩展名可能为空,也可能以句点开头;此函数不会返回目录。需要获取目录时,请使用 os.path.dirname()。
import os
file_path = "/home/user/documents/report.txt"
root, extension = os.path.splitext(file_path)
directory = os.path.dirname(file_path)
print(root)
print(extension)
print(directory)
/home/user/documents/report
.txt
/home/user/documents
对于 archive.tar.gz 这样的文件名,splitext() 只会分离最后一个后缀 .gz。返回的根部分仍包含 archive.tar,因此处理扩展名时,应根据应用所采用的命名约定来决定如何解析。
使用 os.path.dirname 从文件路径获取目录
os.path.dirname() 会以字符串形式返回路径中的目录部分。如果已有一个路径字符串,并且想获取其最后一个部分的父目录,这是最直接的选择。此处链接指向目前清单中可用的英文 API 页面;没有可用的中文页面目标。
import os
file_path = "/home/user/documents/report.txt"
directory = os.path.dirname(file_path)
print(directory)
/home/user/documents
输入变量和函数调用中应使用同一个变量。此函数只处理路径文本,不会检查文件或目录是否存在。如果需要创建、列出或检查目录,请另行使用相应的文件系统操作。
使用 pathlib 获取父目录
pathlib 提供用于路径操作的 Path 对象。Path.parent 属性会以另一个 Path 对象的形式返回父路径;在连续执行路径操作,或将路径传给接受路径类值的 API 时,这种方式会很方便。
from pathlib import Path
file_path = Path("/home/user/documents/report.txt")
parent_directory = file_path.parent
print(parent_directory)
print(file_path.parts)
/home/user/documents
('/', 'home', 'user', 'documents', 'report.txt')
Path.parts 是包含路径各部分的元组,它是属性而不是函数。需要父目录时,请使用 Path.parent;需要查看或按索引访问各个路径部分时,可以使用 parts。
解析相对路径并获取当前工作目录
相对路径是以进程的当前工作目录为起点解释的。os.path.abspath() 会根据该工作目录将相对路径转换为绝对路径。要获取转换后路径所包含的目录,请将结果传给 os.path.dirname()。此处链接指向目前清单中可用的英文 API 页面;没有可用的中文页面目标。
import os
relative_path = "documents/report.txt"
absolute_path = os.path.abspath(relative_path)
file_directory = os.path.dirname(absolute_path)
print(absolute_path)
print(file_directory)
/work/documents/report.txt
/work/documents
Path.cwd() 会以 Path 对象的形式返回当前工作目录,而 os.getcwd() 会以字符串形式返回该目录。它们描述的是进程的工作目录,这个目录可能与 Python 脚本所在目录不同。需要了解相对路径从哪里开始时,请使用这两种方法;在脚本中需要获取脚本所在目录时,请使用 Path(__file__).parent。
import os
from pathlib import Path
print(Path.cwd())
print(os.getcwd())
/work
/work