簡體   English   中英

如何在Python中獲取第n個子目錄?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM