HOWTO · Python
在 Python 中获取绝对路径
它演示了如何在 Python 中获取一个文件的绝对路径。
本页内容
在 Python 中获取文件或目录的绝对路径,可以将路径传给 os.path.abspath(),也可以用 pathlib 创建 Path 对象,再调用 Path.absolute()。这两种方法都会根据进程的当前工作目录将相对路径转换为绝对路径,而且无论目标是否存在,都适用于文件和目录。
下文将定义绝对路径,演示这两种方法,说明当前工作目录如何影响结果,并解释 Path.absolute() 与 Path.resolve() 的区别。
什么是绝对路径?
绝对路径是从文件系统根目录开始,指向文件或目录的完整位置,例如 Linux 和 macOS 上的 /work/myfile.txt,或 Windows 上的 C:\work\myfile.txt。由于它以根目录为起点,无论程序在哪里运行,都能唯一标识一个位置。
相对路径(例如 myfile.txt 或 docs/report.csv)没有根目录作为起点。Python 会根据进程的当前工作目录来解释它,因此同一个相对路径字符串在不同运行中可能指向不同位置。在打开、移动或保存路径之前将它转换为绝对路径,可以消除这种歧义。
使用 os.path.abspath() 获取绝对路径
os 模块属于 Python 标准库。os.path.abspath() 接受路径字符串;如果路径是相对路径,它会将路径与当前工作目录拼接,并规范化结果,折叠其中的 . 和 .. 段。
运行以下示例:
本节中的代码以及显示的标签或输出仍为英文。
import os
absolute_path = os.path.abspath("myfile.txt")
print(absolute_path)
/work/myfile.txt
此示例运行时的当前工作目录是 /work,因此 os.path.abspath() 返回 /work/myfile.txt。在 Windows 上,类似的运行可能返回 C:\work\myfile.txt 这样的值。路径格式随操作系统而异,但调用方式相同。
你也可以用 os.path.join() 将 os.getcwd() 与相对路径拼接,以重现该函数的操作:
import os
absolute_path = os.path.join(os.getcwd(), "myfile.txt")
print(absolute_path)
/work/myfile.txt
os.getcwd() 返回当前工作目录,os.path.join() 则使用适合当前平台的分隔符追加相对路径。os.path.abspath() 会替你完成同样的拼接,并额外规范化 . 和 .. 段;因此,通常直接调用它即可,无需手动构造路径。
使用 pathlib.Path.absolute() 获取绝对路径
pathlib 模块以面向对象的方式处理文件系统路径。Path.absolute() 会返回 Path 对象对应的绝对路径:
本节中的代码以及显示的标签或输出仍为英文。
from pathlib import Path
absolute_path = Path("myfile.txt").absolute()
print(absolute_path)
/work/myfile.txt
如果 Path 对象已经包含绝对路径,Path.absolute() 会原样返回该路径:
from pathlib import Path
print(Path("/work/myfile.txt").absolute())
/work/myfile.txt
不要将 Path.absolute() 与 Path.resolve() 混淆。Path.absolute() 只会将相对路径与当前工作目录拼接;它不会规范化 .. 段,也不会跟随符号链接。Path.resolve() 会处理这两种情况,还可能查询文件系统,因此返回的位置可能与输入路径不同。两者不能互换:需要处理符号链接并折叠 .. 段时,使用 Path.resolve();只需要绝对形式时,使用 Path.absolute()。
理解当前工作目录与路径行为
每个 Python 进程都有一个当前工作目录,可以通过 os.getcwd() 获取:
本节中的代码以及显示的标签或输出仍为英文。
import os
print(os.getcwd())
/work
os.path.abspath() 和 Path.absolute() 都会根据这个目录解析相对路径,而不是根据脚本所在的文件夹。从两个不同目录运行 python app.py,同一个相对路径字符串会得到不同的绝对路径;程序因此找不到文件时,常见原因就是这一点。调用 os.chdir() 会在运行过程中更改工作目录,因此应在切换目录前计算好所需的绝对路径。
有两点实用信息。第一,这两个方法都不会检查目标是否存在:它们只会构造路径字符串,处理文件和目录的方式相同。第二,显示的路径格式取决于操作系统:Linux 和 macOS 使用正斜杠,Windows 使用反斜杠;这两个 API 都会为你处理正确的分隔符。
如何选择 os.path 与 pathlib
两种方法都能生成正确的绝对路径,选择哪一种取决于代码风格以及后续操作。
- 如果你已经将路径作为字符串处理,或只需快速转换一次,可以使用
os.path.abspath();它也适合与os的其他调用(例如os.getcwd())配合使用。 - 如果还要继续处理转换后的路径,可以使用
pathlib。Path对象提供.parent、.name、.stem、用于拼接路径的/运算符,以及.exists()等方法,让较长的文件处理代码更易读。
只转换一次时,两种方法都可以。对于需要执行多种路径操作的新代码,pathlib 通常更易读;如果只需调用一次,os.path.abspath() 则简单可靠。