【问题标题】:python : how to get absolute path for a parent dirpython:如何获取父目录的绝对路径
【发布时间】:2017-10-24 07:18:02
【问题描述】:

我在a/b/c/d/e/f/x.xml 有一个文件。我需要找到目录d 的绝对路径,即与目录名称d 匹配的层次结构上的父目录。

我可以获取文件名的当前目录为 os.path.abspath(__file__) 。我已经看到pathlibglob 的文档,但我无法弄清楚我将如何使用它们。

谁能帮忙

编辑:

感谢下面的所有答案,我得到了一个班轮

os.path.join(*list(itertools.takewhile(lambda x: x != 'd', pathlib.PurePath(os.getcwd()).parts)))

我还需要附加实际的目录名称,即输出应该是 a/b/c/d 。下面是一个丑陋的解决方案(使用 os.path.join 两次)。有人可以修复它(通过在迭代器或列表中添加一个元素:)

os.path.join(os.path.join(*list(itertools.takewhile(lambda x: x != 'd', pathlib.PurePath(os.getcwd()).parts))),"d")

【问题讨论】:

    标签: python path glob


    【解决方案1】:

    您可以在__file__abspath 上使用dirname 来获取x.xml 的完整路径

    os.path.dirname(os.path.abspath(__file__))

    >>> import pathlib
    >>> p = pathlib.PurePath('a/b/c/d/e/f/x.xml')
    >>> p.parts
    ('a', 'b', 'c', 'd', 'f', 'x.xml')
    

    然后您可以提取路径的任何部分。如果要获取d 文件夹:

    import itertools
    res = '/'.join(itertools.takewhile(lambda x: x != 'd', p.parts))
    

    【讨论】:

      【解决方案2】:

      你可以使用pathlibPath.resolve()Path.parents

      from pathlib import Path
      
      path = Path("a/b/c/d/e/f/x.xml").resolve()
      
      for parent in path.parents:
          if parent.name == "d":  # if the final component is "d", the dir is found
              print(parent)
              break
      

      【讨论】:

        【解决方案3】:

        使用正则表达式并剪切:

        import re
        import os
        mydir_regexp = re.compile('dirname')
        abs_path = os.path.abspath(__file__)
        s = re.search(mydir_regexp, abs_path)
        
        my_match = abs_path[:abs_path.index(s.group())+len(s.group())]
        

        【讨论】:

          【解决方案4】:

          假设您在当前目录中有一个文件,您可以使用abspath 获取它的绝对路径(从根目录开始):

          path = os.path.abspath(filename)
          

          神奇的词是os.path.split,它将路径名拆分为最后一个组件和头部(它前面的所有内容)。因此,要获得 d 之前的绝对路径,只需迭代组件即可:

          def findinit(path, comp):
              while (len(path) > 1):
                  t = os.path.split(path)
                  if t[1] == comp:
                      return t[0]
                  path = t[0]
              return None
          

          您可以控制findinit('/a/b/c/d/e/f/x.xml') 按预期提供/a/b/c


          或者,如果您想使用pathlib 模块,您可以在parts 中搜索特定组件:

          def findinit(path, comp):
              p = pathlib.PurePath(path)
              i = p.parts.index(comp)
              if i != -1:
                  return pathlib.PurePath(*p.parts[:i])
              return None
          

          【讨论】:

            【解决方案5】:

            我终于找到了单线:

            os.path.join(*list(itertools.takewhile(lambda x: x != 'd', pathlib.PurePath(os.getcwd()).parts)),"d")
            

            如果没有其他答案,就不可能。非常感谢。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-04-05
              • 2016-01-12
              • 2020-03-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-11-23
              • 1970-01-01
              相关资源
              最近更新 更多