获取文件绝对路径的常用方法包括os.path.abspath()、os.path.realpath()和pathlib.Path.resolve()。其中,os.path.abspath()将相对路径与当前工作目录结合并规范化,但不解析符号链接;os.path.realpath()会解析路径中的所有符号链接,返回实际物理路径;pathlib.Path.resolve()功能类似realpath(),是更现代的面向对象方式,推荐用于新项目。在处理脚本自身路径时,应使用os.path.realpath(__file__)或Path(__file__).resolve()以正确解析符号链接,避免路径错误。选择方法时需根据是否需要解析符号链接及项目结构决定,优先推荐pathlib模块以提升代码可读性和健壮性。

Python中获取文件绝对路径的方法有很多,最常用且可靠的是利用
os
os.path.abspath()
os.path.realpath()
pathlib
Path.resolve()
在Python中处理文件路径,尤其是需要获取其绝对路径时,我们通常会用到以下几种方法。每种方法都有其适用场景和一些需要注意的细节,我个人在实际开发中会根据具体情况灵活选择。
1. 使用 os.path.abspath()
这是最基础也最常用的方法之一。
os.path.abspath(path)
path
path
..
.
path
立即学习“Python免费学习笔记(深入)”;
import os
# 假设当前工作目录是 /Users/yourname/projects/my_project
# 并且有一个文件叫做 'data/config.ini'
# 相对路径
relative_path = 'data/config.ini'
absolute_path_1 = os.path.abspath(relative_path)
print(f"os.path.abspath('{relative_path}') -> {absolute_path_1}")
# 预期输出: /Users/yourname/projects/my_project/data/config.ini
# 带有 '..' 的相对路径
relative_path_with_dots = '../another_project/script.py'
absolute_path_2 = os.path.abspath(relative_path_with_dots)
print(f"os.path.abspath('{relative_path_with_dots}') -> {absolute_path_2}")
# 预期输出: /Users/yourname/projects/another_project/script.py (取决于CWD)
# 绝对路径本身
absolute_path_3 = os.path.abspath('/tmp/test.txt')
print(f"os.path.abspath('/tmp/test.txt') -> {absolute_path_3}")
# 预期输出: /tmp/test.txt2. 使用 os.path.realpath()
os.path.realpath(path)
os.path.abspath()
realpath()
import os
import pathlib
# 假设我们在 /tmp/ 下创建一些文件和符号链接
# os.system('mkdir -p /tmp/real_dir')
# os.system('touch /tmp/real_dir/real_file.txt')
# os.system('ln -s /tmp/real_dir /tmp/symlink_dir')
# os.system('ln -s /tmp/real_dir/real_file.txt /tmp/symlink_file.txt')
# 模拟创建文件和符号链接(如果不存在)
if not os.path.exists('/tmp/real_dir/real_file.txt'):
os.makedirs('/tmp/real_dir', exist_ok=True)
with open('/tmp/real_dir/real_file.txt', 'w') as f:
f.write('hello')
if not os.path.exists('/tmp/symlink_dir'):
os.symlink('/tmp/real_dir', '/tmp/symlink_dir')
if not os.path.exists('/tmp/symlink_file.txt'):
os.symlink('/tmp/real_dir/real_file.txt', '/tmp/symlink_file.txt')
symlink_path = '/tmp/symlink_file.txt'
real_path_1 = os.path.realpath(symlink_path)
abs_path_1 = os.path.abspath(symlink_path)
print(f"对于符号链接 '{symlink_path}':")
print(f" os.path.realpath() -> {real_path_1}") # 会解析到 /tmp/real_dir/real_file.txt
print(f" os.path.abspath() -> {abs_path_1}") # 还是 /tmp/symlink_file.txt
symlink_dir_path = '/tmp/symlink_dir/real_file.txt'
real_path_2 = os.path.realpath(symlink_dir_path)
abs_path_2 = os.path.abspath(symlink_dir_path)
print(f"对于包含符号链接的路径 '{symlink_dir_path}':")
print(f" os.path.realpath() -> {real_path_2}") # 会解析到 /tmp/real_dir/real_file.txt
print(f" os.path.abspath() -> {abs_path_2}") # 还是 /tmp/symlink_dir/real_file.txt3. 使用 pathlib.Path.resolve()
pathlib
path
resolve()
os.path.realpath()
pathlib
from pathlib import Path
# 沿用上面的例子
symlink_path_obj = Path('/tmp/symlink_file.txt')
resolved_path = symlink_path_obj.resolve()
print(f"Path('{symlink_path_obj}').resolve() -> {resolved_path}")
# 预期输出: /tmp/real_dir/real_file.txt
# 对于一个普通文件或目录
normal_path_obj = Path('data/config.ini') # 假设CWD下有data/config.ini
# 注意:如果文件不存在,resolve() 会抛出 FileNotFoundError,除非设置 strict=False
# 为了演示,我们假设文件存在或者使用 strict=False
try:
resolved_normal_path = normal_path_obj.resolve()
print(f"Path('{normal_path_obj}').resolve() -> {resolved_normal_path}")
except FileNotFoundError:
print(f"Path('{normal_path_obj}').resolve() -> 文件或目录不存在,但如果存在会解析为绝对路径。")
# resolve(strict=False) 可以在文件不存在时避免抛出错误,但它仍然会尝试解析路径中的符号链接部分
non_existent_path = Path('/non_existent_dir/file.txt')
resolved_non_existent = non_existent_path.resolve(strict=False)
print(f"Path('{non_existent_path}').resolve(strict=False) -> {resolved_non_existent}")
# 预期输出: /non_existent_dir/file.txt (如果路径中没有符号链接,它会像 abspath 一样处理)这俩函数初看起来很像,都是为了给你一个“绝对路径”,但它们在处理符号链接(Symbolic Links,也叫软链接)时表现出根本性的差异,这直接影响了你在特定场景下的选择。
简单来说:
os.path.abspath(path)
path
os.getcwd()
./
../
os.path.realpath(path)
abspath
path
realpath
何时选择哪个?
我个人在实践中,通常是这样考虑的:
当你只需要一个规范化的绝对路径,并且不关心它是否是符号链接时,用 os.path.abspath()
abspath
当你需要知道一个文件或目录的“物理”位置,或者需要避免符号链接带来的潜在问题时,用 os.path.realpath()
pathlib.Path.resolve()
realpath
realpath
realpath
FileNotFoundError
pathlib.Path.resolve(strict=False)
总结一下,如果你不确定,或者你的应用场景可能涉及到符号链接并且你希望行为更明确,那么
os.path.realpath()
pathlib.Path.resolve()
os.path.abspath()
获取当前脚本文件的绝对路径听起来很简单,但实际操作中确实有一些容易踩坑的地方,这块儿其实挺有意思的,因为它和Python的执行环境以及模块导入机制紧密相关。
1. __file__
最常见的获取当前脚本路径的方法是使用内置变量
__file__
__file__
python my_script.py
__file__
__file__
ipython
python
__file__
<stdin>
exec()
eval()
__file__
这意味着,仅仅依赖
__file__
2. 仅仅 os.path.abspath(__file__)
在大多数情况下,
os.path.abspath(__file__)
__file__
陷阱:符号链接! 如果你的脚本是通过一个符号链接被执行的,那么
__file__
os.path.abspath(__file__)
举个例子:
/real_scripts/my_script.py
/usr/local/bin/my_script
/real_scripts/my_script.py
python /usr/local/bin/my_script
__file__
/usr/local/bin/my_script
os.path.abspath(__file__)
/usr/local/bin/my_script
/real_scripts/my_script.py
abspath
3. 正确且健壮的做法:结合 realpath
resolve
为了避免上述陷阱,确保无论脚本如何被调用或是否存在符号链接,都能获取到其“真实”的物理绝对路径,最佳实践是使用
os.path.realpath()
pathlib.Path.resolve()
import os
from pathlib import Path
# 获取当前脚本文件的绝对路径(处理符号链接)
# 推荐方法一:使用 os 模块
current_script_path_os = os.path.realpath(__file__)
print(f"os.path.realpath(__file__) -> {current_script_path_os}")
# 获取当前脚本所在目录的绝对路径
current_script_dir_os = os.path.dirname(current_script_path_os)
print(f"os.path.dirname(os.path.realpath(__file__)) -> {current_script_dir_os}")
# 推荐方法二:使用 pathlib 模块(更现代、更清晰)
current_script_path_pathlib = Path(__file__).resolve()
print(f"Path(__file__).resolve() -> {current_script_path_pathlib}")
# 获取当前脚本所在目录的绝对路径
current_script_dir_pathlib = Path(__file__).resolve().parent
print(f"Path(__file__).resolve().parent -> {current_script_dir_path_pathlib}")Path(__file__).resolve()
4. sys.argv[0]
sys.argv[0]
__file__
python -c "import my_module; my_module.run()"
sys.argv[0]
-c
总结一下:获取当前脚本的绝对路径,最稳妥的方式是
os.path.realpath(__file__)
Path(__file__).resolve()
os.path.dirname()
.parent
在文件路径处理上,相对路径和绝对路径的选择,在我看来,更多的是一个工程哲学问题,关乎代码的健壮性、可移植性以及可维护性。没有一劳永逸的答案,但有一些策略可以指导我们做出更好的决策。
1. 相对路径的优势与劣势
优势:
/home/user/
C:\Users\User\
劣势:
2. 绝对路径的优势与劣势
优势:
劣势:
/home/user/project/data.txt
3. 我的选择策略:组合拳和最佳实践
我个人在实际开发中,倾向于采取一种“组合拳”的策略,并遵循以下几个原则:
确定一个项目根目录的“基准点”:
PROJECT_ROOT = Path(__file__).resolve().parent.parent
project_root/src/
pyproject.toml
.git
PROJECT_ROOT
PROJECT_ROOT
项目内部资源,优先使用相对于“基准点”的路径:
PROJECT_ROOT
PROJECT_ROOT / "data" / "config.json"
以上就是python如何获取文件的绝对路径_python获取文件绝对路径的方法的详细内容,更多请关注php中文网其它相关文章!
python怎么学习?python怎么入门?python在哪学?python怎么学才快?不用担心,这里为大家提供了python速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号