gpt4 book ai didi

Python os.walk 复杂目录条件

转载 作者:太空宇宙 更新时间:2023-11-04 00:44:22 28 4
gpt4 key购买 nike

我需要扫描包含数百或 GB 数据的目录,其中包含结构化部分(我想扫描)和非结构化部分(我不想扫描)。

阅读 os.walk 函数,我发现我可以使用一组中的一组条件来排除或包含某些目录名称或模式。

对于这个特定的扫描,我需要在目录中的每个级别添加特定的包含/排除条件,例如:

在根目录中,假设有两个有用的目录“Dir A”和“Dir B”以及一个无用的垃圾目录“Trash”。在目录 A 中有两个有用的子目录“Subdir A1”和“Subdir A2”以及一个无用的“SubdirA Trash”目录,然后在目录 B 中有两个有用的子目录 Subdir B1 和 Subdir B2 以及一个无用的“SubdirB Trash”子目录。看起来像这样:

Example Directory

我需要为每个级别都有一个特定的标准列表,如下所示:

level1DirectoryCriteria = set("Dir A","Dir B")

level2DirectoryCriteria = set("Subdir A1","Subdir A2","Subdir B1","Subdir B2")

我能想到的唯一方法显然是非 Python 的,使用复杂而冗长的代码,其中包含大量变量和不稳定的高风险。有没有人对如何解决这个问题有任何想法?如果成功,一次可以节省数小时的代码运行时间。

最佳答案

你可以尝试这样的事情:

to_scan = {'set', 'of', 'good', 'directories'}
for dirpath, dirnames, filenames in os.walk(root):
dirnames[:] = [d for d in dirnames if d in to_scan]
#whatever you wanted to do in this directory

此解决方案很简单,如果您想扫描具有特定名称的目录(如果它们出现在一个目录中而不是另一个目录中),此解决方案将失败。另一种选择是将目录名称映射到列表或白名单或黑名单目录集的字典。

编辑:我们可以使用 dirpath.count(os.path.sep) 来确定深度。

root_depth = root.count(os.path.sep) #subtract this from all depths to normalize root to 0
sets_by_level = [{'root', 'level'}, {'one', 'deep'}]
for dirpath, dirnames, filenames in os.walk(root):
depth = dirpath.count(os.path.sep) - root_depth
dirnames[:] = [d for d in dirnames if d in sets_by_level[depth]]
#process this directory

关于Python os.walk 复杂目录条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40423606/

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