【问题标题】:Python idiom to get same result as calling os.path.dirname multiple times?Python 成语获得与多次调用 os.path.dirname 相同的结果?
【发布时间】:2014-09-12 19:01:34
【问题描述】:

我发现自己需要在源代码树中获取 python 文件的父目录,该目录是多个目录,并且有一定的规律性。必须多次调用 dirname 很笨重。

我环顾四周,很惊讶没有找到这方面的帖子。

一般情况是:

import os.path as op
third_degree_parent = op.dirname(op.dirname(op.dirname(op.realpath(__file__))))

有没有更惯用的方法来做到这一点,不需要嵌套的 dirname 调用?

【问题讨论】:

    标签: python build filepath os.path dirname


    【解决方案1】:

    4 年后的 2018 年,其他人添加了答案,所以为什么不添加我的答案。如果需要更多的父母,其他答案要么很长,要么变得很长。假设您需要 7 个父母。我就是这样做的

    os.path.abspath(__file__ + 8 * '/..')
    

    注意额外的 (8=7+1) 删除 7 个父项以及文件名。不需要os.path.pardir,因为abspath 普遍理解/..,并且会做正确的事情。还有一个优点是父母的数量可以是动态的,在运行时确定。

    相比之下,使用接受的答案的等效项(更长且不太明显):

    import os.path as op
    op.abspath(op.join(__file__, op.pardir, op.pardir, op.pardir, op.pardir, op.pardir, op.pardir, op.pardir))
    

    【讨论】:

      【解决方案2】:

      规范化一个相对路径; os.pardir 是父目录,根据需要重复多次。它也可以通过os.path.pardir 获得:

      import os.path as op
      
      op.abspath(op.join(__file__, op.pardir, op.pardir, op.pardir))
      

      【讨论】:

      • 这正是我想要的。作为后续,如果这种方法遇到任何极端情况怎么办?
      • @TimWilder:我现在想不到;如果您发现任何问题,请告诉我,我会看看我们如何解决这些问题。
      • 我正在考虑符号链接的问题;我需要考虑 op.join 方法和路径之间的交互/做一些阅读以更充分地探索这一点。一般关注的是 os.path.abspath 与 os.path.realpath。
      • @TimWilder: realpath 在后台使用abspath,所以请随意更换电话。
      • 很高兴知道。我觉得这是对 dirname 调用的清晰度和简洁性的改进,所以谢谢。
      【解决方案3】:

      由于尚未演示,这里是使用recursive 函数的答案。

      功能

      import os
      def parent(path, level = 0):
          parent_path = os.path.dirname(path)
          if level == 0:
              return parent_path
          return parent(parent_path, level - 1)
      

      说明

      • 获取输入路径的目录名
      • 如果level不为0,函数会调用自身,导致获取目录名的目录名
      • 过程递归重复,直到级别达到 0

      示例

      >>> parent('/my/long/path/name/with/a/file.txt')
      '/my/long/path/name/with/a'
      >>> parent('/my/long/path/name/with/a/file.txt', 0)
      '/my/long/path/name/with/a'
      >>> parent('/my/long/path/name/with/a/file.txt', 4)
      '/my/long'
      

      【讨论】:

        【解决方案4】:
        def updir(d, n):
          """Given path d, go up n dirs from d and return that path"""
          ret_val = d
          for _ in range(n):
            ret_val = os.path.dirname(ret_val)
          return ret_val
        

        给定一个目录d = '/path/to/some/long/dir',你可以使用上面的函数来升级任意多的级别。例如:

        updir(d,0)
        '/path/to/some/long/dir'
        updir(d,1)
        '/path/to/some/long'
        updir(d,2)
        '/path/to/some'
        updir(d,3)
        '/path/to'
        updir(d,4)
        '/path'
        

        【讨论】:

        • 请在您的回答中添加一点解释,以帮助人们更好地理解。
        • 我添加了解释和示例。
        【解决方案5】:

        我将用 N 扩展接受的答案

        import os.path as op
        
        op.abspath(op.join(__file__, \*N\*[op.pardir]))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-17
          • 1970-01-01
          • 2018-10-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多