所以基本上我想迭代我的文件系统,从“/”(Unix)开始,除了我想从文件中读取的排除项,也可以是列表、生成器或其他任何东西。 让我们举个例子:
# What I want to exclude in a file
# (Just few examples)
EXCLUSIONS = ['/sys/*', '/var/lock/*, '*.pyc/*']
我的想法是:
import fnmatch
for exclude in EXCLUSIONS:
for root, dirs, files in os.walk('/'):
path = root.split(os.sep)
for p in path:
for f in files:
tmp = p + f
if fnmatch.fnmatch(tmp, exclude):
...
我想这是非常低效的,这就是为什么它不起作用。 也许有人能给我一个提示或者知道一个方法来做到这一点
假设我们的排除规则是“根据
fnmatch.fnmatch
的逻辑,路径匹配EXCLUSIONS
的any
”,我们可以编写一个函数来封装:(我们可以通过接受排除作为第一个参数,而不是依赖全局参数,然后使用
functools.partial
绑定它来概括这一点。)使
os.walk
远离修剪过的目录的方法是自上而下(默认)修改生成的子目录列表。我们希望迭代地将规则应用于列表,同时修改它,这is tricky;我所能想到的最优雅的方法是使用列表理解创建修改后的版本,然后将其切回原位:(注意这里的泛化;我们希望将过滤谓词
should_exclude
作为参数传递。)现在我们应该能够使用
os.walk
,如文档所示:这可以根据您的具体要求以多种方式进行更改。例如,您可以在
files
和os.path.join
上迭代到subroot
,yield
上,分别处理每个结果。值得一试和调试,以确保您准确理解迭代的每个步骤中subroot
、dirs
和files
的样子,并验证过滤是否给出了您期望的结果因此,@Karl Knechtel的回答让我想到了以下几点:
我仍然认为这仍然是没有效率的,尤其是对于更大的文件系统。可能是可以优化的
此代码允许您通过所有文件系统。可以选择“输入点”和“排除目录”。它有非常简单的排除机制,但您可以根据自己的方便程度对其进行更改
相关问题 更多 >
编程相关推荐