【问题标题】:Python joining current directory and parent directory with os.path.joinPython 使用 os.path.join 加入当前目录和父目录
【发布时间】:2013-06-22 02:49:06
【问题描述】:

我想在目录树的某个位置加入当前目录路径和相对目录路径goal_dir,所以我得到了goal_dir 的绝对路径。这是我的尝试:

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没那么聪明。

我该怎么做?

【问题讨论】:

  • 请记住,os.getcwd() 获取您执行脚本的位置,而 os.path.dirname(__file__) 获取 Python 文件所在的位置。请务必为您的应用使用正确的!

标签: python os.path


【解决方案1】:

最近,我发现了 pathlib。

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

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

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

在这两种情况下,都可以像这样找到简化形式的绝对路径:

goal_dir = goal_dir.resolve()

【讨论】:

  • Linux环境文件夹呢?
  • @InfiniteLoops 他们呢?他们很好!您可以使用os.environ[var]os.getenv(var) 访问它们。我认为pathlib 不会访问它们。
  • 我有一个 py 脚本,我现在正在工作,我不确定目录位置是否正确。因为当我尝试在 Collab 上运行它时,它说找不到文件或目录。
  • Colab 是另一回事。我建议您提出一个新问题(或先尝试查找)。
【解决方案2】:

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

或者可以使用os.path.normpath这将返回规范化路径(规范化路径,消除双斜杠等)

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

如果是abspath,在你的例子中,你不需要使用os.path.join

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

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

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

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

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

【讨论】:

    【解决方案3】:

    您可以使用normpathrealpathabspath

    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
    

    【讨论】:

      猜你喜欢
      • 2015-08-22
      • 2021-11-06
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      • 2012-01-29
      • 2010-09-24
      • 1970-01-01
      相关资源
      最近更新 更多