如何在Python中获取第n个子目录?

时间:2015-07-08 18:53:57

标签: python directory python-os

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

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

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

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个子目录?

5 个答案:

答案 0 :(得分:2)

递归方法:

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

n是目录树上的级别数。

答案 1 :(得分:1)

您可以使用{{1}}获取文件的绝对路径。这应该为您提供类似于&#39; C:\ folder1 \ folder2 \ folder3 \ ...&#39;的内容。然后,您可以使用字符串操作来查找第n个目录。

答案 2 :(得分:1)

你知道这需要一个聪明的clogs递归解决方案,但也许像

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

会很清楚,只需拆分os.path.abspath()就可以保留你将失去的os.path本地化魔法。

你可以尝试像

这样的东西
os.path.dirname(os.path.normpath(__file__+"../"*n))

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

答案 3 :(得分:0)

这有点尴尬,但很短,可以直接使用:

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

答案 4 :(得分:0)

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__))