Python使用os.path.join连接当前目录和父目录

Python joining current directory and parent directory with os.path.join

我想将当前目录路径和相对目录路径goal_dir连接到目录树中的某个位置,因此我获得了goal_dir的绝对路径。 这是我的尝试:

1
2
import os
goal_dir = os.path.join(os.getcwd(),"../../my_dir")

现在,如果当前目录是C:/here/I/am/,它将以C:/here/I/am/../../my_dir的形式加入它们,但是我想要的是C:/here/my_dir。 似乎os.path.join不是那么聪明。

我怎样才能做到这一点?


您可以使用normpath,realpath或abspath:

1
2
3
4
5
6
import os
goal_dir = os.path.join(os.getcwd(),"../../my_dir")
print goal_dir  # prints C:/here/I/am/../../my_dir
print os.path.normpath(goal_dir)  # prints C:/here/my_dir
print os.path.realpath(goal_dir)  # prints C:/here/my_dir
print os.path.abspath(goal_dir)  # prints C:/here/my_dir

考虑使用os.path.abspath这将评估绝对路径

或可以使用os.path.normpath来返回标准化路径(Normalize path,消除双斜杠等)

一个人应该根据需求选择这些功能之一

abspath的情况下,您无需使用os.path.join

1
os.path.abspath("../../my_dir")

如果您对相对路径感兴趣,请使用os.path.normpath

1
2
>>> os.path.normpath("../my_dir/../my_dir")
'../my_dir'

有关处理文件路径的其他参考:

  • pathlib-面向对象的文件系统路径
  • os.path-常用路径名操作


最近,我发现了pathlib。

1
2
3
from pathlib import Path
cwd = Path.cwd()
goal_dir = cwd.parent.parent /"my_dir"

或者,使用当前脚本的文件:

1
2
cwd = Path(__file__).parent
goal_dir = cwd.parent.parent /"my_dir"

在这两种情况下,可以找到简化形式的绝对路径,如下所示:

1
goal_dir = goal_dir.resolve()