Python 3.5's os.scandir(path)
函數返回對文件信息非常有用的輕量級DirEntry對象。但是,它只適用於交給它的直接路徑。有沒有辦法將它包裝在遞歸函數中,以便它訪問給定路徑下的所有子目錄?如何使用os.scandir()在目錄樹上遞歸地返回DirEntry對象?
回答
可以掃描遞歸使用os.walk()
,或者如果您需要DirEntry
對象或更多的控制,寫一個遞歸函數像下面scantree()
:
try:
from os import scandir
except ImportError:
from scandir import scandir # use scandir PyPI module on Python < 3.5
def scantree(path):
"""Recursively yield DirEntry objects for given directory."""
for entry in scandir(path):
if entry.is_dir(follow_symlinks=False):
yield from scantree(entry.path) # see below for Python 2.x
else:
yield entry
if __name__ == '__main__':
import sys
for entry in scantree(sys.argv[1] if len(sys.argv) > 1 else '.'):
print(entry.path)
注:
- 這裏有幾個例子在PEP 471和os.scandir() docs。
- 您還可以在for循環中添加各種邏輯以跳過以
'.'
開頭的目錄或文件等等。 - 您通常想在
is_dir()
上調用follow_symlinks=false
這樣的遞歸函數來避免符號鏈接循環。 關於Python 2.x中,替換與
yield from
行:for entry in scantree(entry.path): yield entry
由於'os.scandir'只存在於Python 3.5中,因此可能不需要Python 2後備代碼。 :-) __Edit:__啊,如果'os.scandir'不存在,你寫它來導入PyPI模塊,我猜PyPI模塊可用於2.7? – ShadowRanger
@ShadowRanger好吧,這是真的,但是這種方式可以使用我的[scandir]模塊(https://pypi.python.org/pypi/scandir)爲Python <3.5(包括Python 2.x)工作。 :-) –
@ShadowRanger我已經添加了代碼註釋來澄清。 –
- 1. 使用os.scandir停留在遞歸目錄搜索中
- 2. 遞歸函數返回目錄文件樹的深度
- 3. 遞歸函數返回目錄深度
- 4. 如何通過目錄樹遞歸使用PowerShell
- 5. 如何在PHP中遞歸地返回完整路徑的目錄?
- 6. 如何在樹中使用遞歸
- 7. 遞歸地刪除目錄
- 8. 在遞歸函數中返回並使用多個樹結構
- 9. 如何遞歸返回
- 10. 使用最大元素返回對象的Java遞歸
- 11. Ruby創建遞歸目錄樹
- 12. 通過PHP中的目錄樹遞歸
- 13. 遞歸符號鏈接的目錄樹
- 14. 如何在python中遞歸樹時跳過.hg/.git/.svn目錄
- 15. 如何使用NSFileManager遞歸地更改目錄的權限setAttributes
- 16. 如何從遞歸函數中返回對象?
- 17. 丟失目錄級別的遞歸powershell目錄對象
- 18. 的realloc在樹上遞歸
- 19. 使用ls遞歸打印完整目錄樹的shell腳本
- 20. 在Go中遞歸地返回文件列表,其中包括根目錄
- 21. 如何遞歸返回從QStandardItemModel派生的樹模型中的特定項目?
- 22. 如何遞歸遍歷目錄樹並僅查找文件?
- 23. 循環遍歷一個對象(樹)遞歸地
- 24. 無法遞歸地使用python在窗口中走路目錄
- 25. 遞歸地調用一個返回自身迭代器的對象方法
- 26. 使用遞歸篩選樹
- 27. SQL CTE遞歸:返回父記錄
- 28. PostgreSQL遞歸函數返回記錄集
- 29. 如何用Perl或shell非遞歸地遷移目錄?
- 30. 如何找到特定對象形式的樹遞歸
看一看[os.walk()](https://docs.python.org/3.5/library /os.html#os.walk)。它可能比你想要的更加沉重,但它應該比創建自己的解決方案更簡單。 – skrrgwasme