gpt4 book ai didi

python - 更实用的os.walk

转载 作者:太空宇宙 更新时间:2023-11-03 19:25:23 25 4
gpt4 key购买 nike

由于我需要对目录进行多次遍历,其中需要进行一些复杂的过滤,因此我想围绕 os.walk 创建一个包装器。

这是这样的:

def fwalk(root, pred_dir, pred_files, walk_function=walk):
"""Wrapper function around the standard os.walk, that filter out
the directories visited using a filtering predicate
"""

for base, dirs, files in walk_function(root):
# ignore also the root directory when not needed, which is
# actually more important than the subdirectories
dirs = [d for d in dirs if pred_dir(path.join(base, d))]
files = [f for f in files if pred_files(path.join(base, f))]

if _ignore_dirs_predicate(base) and (dirs or files):
yield base, dirs, files

基本上它的行为与 os.walk 一样,但需要两个谓词来使其更好地组合在更高级别的函数中。例如,这只会通过 python 模块:

ISA_PY = lambda f: f[-3:] == '.py'
# I can make it a class or maybe even a module if it's better
def walk_py(src):
# should not be in the list
return fwalk(src, _ignore_dirs_predicate, ISA_PY)

它还需要一个步行函数,例如可以只是一个虚拟步行,用于测试。

def dummy_walk(_):
test_dir = [
('/root/', ['d1, .git'], []),
('/root/d1', [], ['setup.py']),
('/root/test', [], ['test1.py']),
('/root/.git', [], [])
]

# returns a function which skips the parameter and return the iterator
return iter(test_dir)

现在的问题是,我发现很难相信这个函数,除了使用虚拟行走的一些单元测试很难确保它是正确的。

关于如何改进它并使其变得更好有什么建议吗?

最佳答案

您需要就地修改目录,以避免递归遍历已删除的目录。使用:

dirs[:] = [d for d in dirs if pred_dir(path.join(base, d))]

这将消除检查 _ignore_dirs_predicate(base) 的需要(并消除由于使用 _ignore_dirs_predicate 而不是 导致的 NameError >pred_dir)

您还应该重写ISA_PY以使用str.endswith()

关于python - 更实用的os.walk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8324840/

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