Python 3.5的os.scandir(path)
函数返回轻量级的DirEntry对象,非常有助于获得关于文件的信息。但是,它仅适用于直接传递给它的路径。是否有一种方法将其包装在递归函数中,以便访问给定路径下的所有子目录?
Python 3.5的os.scandir(path)
函数返回轻量级的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)
注意:
'.'
开头的目录或文件等。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 的回退代码可能不再需要。 :-) 编辑: 啊,你编写了导入 PyPI 模块的代码,如果 os.scandir
不存在,我猜测 PyPI 模块在 2.7 中是可用的? - ShadowRanger