【问题标题】:How to get the nth subdirectory in Python?如何在 Python 中获取第 n 个子目录?
【发布时间】:2015-07-08 18:53:56
【问题描述】:

假设我在一个文件夹中有一个名为 xyz 的文件,如下所示:

Directory
   |
   |+ Subdirectory_n
           |
           |+ Subdirectory_(n-1)
                   |
                   |+ Subdirectory_(n-2)
                           |
                           |+ Subdirectory_(n-3)
                                    ........
                                           |+ Subdirectory_1
                                                   |
                                                   |+ xyz

如果我想要文件中的第 n 个子目录,我如何获得它 python? 例如对于第二个子目录,我可以执行以下操作:

import os
file = open('xyz.dat', 'w+')
print os.path.dirname(os.path.dirname(__file__))

第三个

import os
file = open('xyz.dat', 'w+')
print os.path.dirname(os.path.dirname(os.path.dirname(__file__)))

这个方法看起来有点别扭。有没有更好的方法来做到这一点,以便我可以将它推广到 Python 中的第 n 个子目录?

【问题讨论】:

  • 你想要子目录还是包含目录?
  • @JeremyKemball 文件中从 0 开始的第 n 个子目录。

标签: python directory python-os


【解决方案1】:

递归方法:

def nth_parent(path, n): return path if n <= 0 else os.path.dirname(nth_parent(path, n-1))

n 是向上目录树的层数。

【讨论】:

    【解决方案2】:

    这个有点别扭,但足够短,可以直接使用:

    reduce(lambda x, y: y(x), [os.path.dirname]*n, path)

    【讨论】:

      【解决方案3】:

      您可以使用os.path.abspath() 获取文件的绝对路径,这应该会给您类似“C:\folder1\folder2\folder3\...”的信息。然后可以使用字符串操作找到第 n 个目录。

      【讨论】:

        【解决方案4】:

        你知道这需要一个聪明的递归解决方案,但可能类似于

        n=5
        while(n):
            path=os.path.dirname(path)
            n -=1
        

        会很清楚,并保留您通过拆分 os.path.abspath() 会失去的 os.path 本地化魔法。

        你总是可以尝试类似的东西

        os.path.dirname(os.path.normpath(__file__+"../"*n))
        

        但这并不保证适用于所有符号链接等。

        【讨论】:

          【解决方案5】:

          Python ≥ 3.4 实现PEP 428 并为您带来pathlib,给您更大的灵活性。

          可以通过以下方式恢复“现代”方式:

          pathlib.Path('xyz.dat').resolve().parents[nth_parent - 1]
          
          # equivalent of:
          filename = os.path.realpath('xyz.dat')
          for _ in range(nth_parent):
              filename = os.path.dirname(filename)
          

          其中nth_parentnumber of ancestors,零表示直接父级(因此在示例中为 - 1)。

          等价(os.path):

          filename = 'xyz.dat'
          pathlib.Path(filename).resolve(), os.path.realpath(filename)
          
          # PurePath does not have resolve() nor other features added by the Path subclass;
          # but when the paths are absolutes, those two are similar
          pathlib.Path(__file__) == pathlib.PurePath(__file__)
          
          pathlib.Path(__file__).parents[0], pathlib.Path(__file__).parent, os.path.dirname(__file__)
          
          pathlib.Path(__file__).parents[1], pathlib.Path(__file__).parent.parent, os.path.dirname(os.path.dirname(__file__))
          

          【讨论】:

            猜你喜欢
            • 2023-03-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多