gpt4 book ai didi

Python 2.7 - 使用scandir遍历所有子目录并返回列表

转载 作者:行者123 更新时间:2023-12-01 09:34:22 25 4
gpt4 key购买 nike

使用 Python 2.7 和 scandir,我需要遍历所有目录和子目录并仅返回目录列表。不是文件。路径中子目录的深度可能会有所不同。

我知道 os.walk,但我的目录有 200 万个文件,因此 os.walk 会变慢。

目前,下面的代码对我有用,但我怀疑可能有一种更简单的方法/循环来实现相同的结果,我想知道如何改进它。另外,我的功能的限制是它仍然受到我可以遍历子目录的深度的限制,也许这个可以克服。

def list_directories(path):
dir_list = []
for entry in scandir(path):
if entry.is_dir():
dir_list.append(entry.path)
for entry2 in scandir(entry.path):
if entry2.is_dir():
dir_list.append(entry2.path)
for entry3 in scandir(entry2.path):
if entry3.is_dir():
dir_list.append(entry3.path)
for entry4 in scandir(entry3.path):
if entry4.is_dir():
dir_list.append(entry4.path)
for entry5 in scandir(entry4.path):
if entry5.is_dir():
dir_list.append(entry5.path)
for entry6 in scandir(entry5.path):
if entry6.is_dir():
dir_list.append(entry6.path)
return dir_list
for item in filelist_dir(directory):
print item

如果您有更好的替代方案来快速返回包含数百万个文件的路径中的所有目录和子目录,请告诉我。

最佳答案

scandir支持walk()函数包含与 scandir() 相同的优化,因此它应该比 os.walk() 更快。 (scandir 的 background section 建议在 Linux/Mac OS X 上提高 3-10 倍。)

所以你可以使用它......类似这样的代码可能会起作用:

from scandir import walk

def list_directories(path):
dir_list = []
for root, _, _ in walk(path):
# Skip the top-level directory, same as in your original code:
if root == path:
continue
dir_list.append(root)
return dir_list

如果您想使用 scandir() 来实现此功能,为了实现支持任意深度的功能,您应该使用递归。

类似于:

from scandir import scandir

def list_directories(path):
dir_list = []
for entry in scandir(path):
if entry.is_dir() and not entry.is_symlink():
dir_list.append(entry.path)
dir_list.extend(list_directories(entry.path))
return dir_list

注意:我也添加了对 is_symlink() 的检查,因此它不会遍历符号链接(symbolic link)。否则,符号链接(symbolic link)指向“.”或者 '..' 会使这个递归永远......

我仍然认为使用 scandir.walk() 更好(更简单、更可靠),所以如果它适合您,请改用它!

关于Python 2.7 - 使用scandir遍历所有子目录并返回列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49664518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com