假设你有以下代码:
os.path.abspath(os.path.join('../../', __file__))
我很困惑,因为目前,它正在__file__
路径中返回我相同的路径。
知道为什么我没有在__file__
路径上爬两级吗?
__file__
是绝对文件路径,因此连接会尝试如下操作:
os.path.join('../../', '/path/to/file')
由于第二个参数已经是绝对路径,因此所有先前的参数都是无效的。
另请注意,__file__
包含文件名本身,因此如果您想向上放置两个目录,则需要将其拆分。最简单的解决方案是使用 pathlib.Path
:
Path(__file__).parents[2]
如果你想n
级别,你可以使用 Path(__file__).parents[n]
.
从文档(强调我的):
os.path.join(path, *paths)
联接一个或多个路径组件 智能。返回值是路径和任何 只有一个目录分隔符的 *path 的成员 (OS.sep) 在除最后一个部分之外的每个非空部分之后,这意味着结果 仅当最后一部分为空时,才会以分隔符结尾。如果组件 是绝对路径,所有以前的组件都被丢弃, 从绝对路径组件继续连接。
__file__
是绝对路径,因此join
忽略前面的../../
。
经过更多的尝试和错误,我想我找到了最好的解决方案:
os.path.abspath(os.path.join(__file__, '../../'))