1

假设我在一个文件夹中有一个名为 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 个子目录?

4

5 回答 5

3

递归方法:

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

n是向上目录树的层数。

于 2015-07-08T19:16:58.163 回答
1

os.path.abspath()您可以使用That should give you something like 'C:\folder1\folder2\folder3\...'获取文件的绝对路径。然后,您可以使用字符串操作来查找第 n 个目录。

于 2015-07-08T19:00:01.927 回答
1

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

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

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

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

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

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

于 2015-07-08T19:08:30.960 回答
1

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

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

于 2015-07-09T19:02:01.180 回答
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_parent祖先的数量在哪里,零表示直接父母(因此 - 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__))
于 2020-06-24T13:01:57.083 回答