[英]How to get the nth subdirectory in Python?
假設我在文件夾中有一個名為 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 個子目錄?
遞歸方法:
def nth_parent(path, n): return path if n <= 0 else os.path.dirname(nth_parent(path, n-1))
n
是在目錄樹中向上移動的級別數。
您可以使用os.path.abspath()
獲取文件的絕對路徑,這應該會給您類似“C:\\folder1\\folder2\\folder3\\...”的信息。 然后,您可以使用字符串操作來查找第 n 個目錄。
你知道這需要一個聰明的木屐遞歸解決方案,但也許像
n=5
while(n):
path=os.path.dirname(path)
n -=1
會很清楚並保留 os.path 本地化魔法,你會因為拆分 os.path.abspath() 而失去。
你總是可以嘗試像
os.path.dirname(os.path.normpath(__file__+"../"*n))
但這不能保證適用於所有符號鏈接等。
這有點尷尬,但足夠短,可以直接使用:
reduce(lambda x, y: y(x), [os.path.dirname]*n, path)
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__))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.