os.walk,但每个目录有前后动作?

时间:2011-10-14 16:14:58

标签: python filesystems

Python的os.walk函数几乎就是我想要的,但我需要为每个目录做一个前后遍历操作。

e.g。如果树是

 foo/
 foo/bar/
 foo/bar/baz/
 foo/quux/

然后我想做这个序列:

 pre-action on foo/
 pre-action on foo/bar/
 pre-action on foo/bar/baz/
 post-action on foo/bar/baz/
 post-action on foo/bar/
 pre-action on foo/quux/
 post-action on foo/quux/
 post-action on foo/

我该怎么做? (没有写我自己的功能)

2 个答案:

答案 0 :(得分:2)

如果您不想自己编写简单的递归函数,可以使用自己的堆栈:

stack = []
for root, dirs, files in os.walk("foo"):
    while stack and not root.startswith(stack[-1]):
        print "post-action on", stack.pop()
    print "pre-action on", root
    stack.append(root)
while stack:
    print "post-action on", stack.pop()

编写自己的函数可能会提供更易读的代码:

def walk(dir):
    print "pre-action on", dir
    for name in os.listdir(dir):
        fullname = os.path.join(dir, name)
        if os.path.isdir(fullname):
            walk(fullname)
    print "post-action on", dir

答案 1 :(得分:0)

总之,你不能。图书馆没有提供任何选项。但是,您可以通过设置topdown=True [link] 来限制实际返回给您的步数。这可以允许您仅对搜索中的某些目录执行操作。最好的例子在文档中给出。这可能会解决您的问题。