假设我在文件夹中有一个名为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个子目录?
答案 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_parent
是number 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__))