os.walk()反向?

时间:2012-01-30 10:41:24

标签: python

当我运行os.walk()时,我的结果是字母数字顺序;从0开始,以z结尾。有可能扭转这种局面吗?

所以,如果我有3个目录; apple/bananas/pears/,我希望pears/bananas/apples/返回。

显然我可以将所有目录存储为列表,然后.reverse(),但这需要很长时间。

3 个答案:

答案 0 :(得分:16)

首先,os.walk()没有指定目录的返回顺序,所以如果我是你,我就不会依赖字母顺序。

话虽如此,您可以通过将topdown设置为其默认值(True),然后就地排序dirs来选择遍历子目录的顺序:

import os
top='/home/aix'
for root, dirs, files in os.walk(top, topdown=True):
  print root
  dirs.sort(reverse=True)

这将使os.walk()以其名称的反向词典顺序遍历子目录。

documentation解释了这是如何工作的:

  

topdownTrue时,调用者可以就地修改dirnames列表(可能使用del或切片分配),而walk()只会递归到名称保留在dirnames的子目录;这可用于修剪搜索,强制执行特定的访问顺序,甚至可以通知walk()调用者在再次恢复walk()之前创建或重命名的目录。

答案 1 :(得分:1)

您需要了解,您实际上可以修改dirs使用的os.walk。 (至少除非你明确设置topdown=False)。

特别是,您可以删除目录或使用列表。

import os
for root, dirs, files in os.walk(startdir):
    dirs.sort(reverse=True)
    # Also remove dirs you do not need!

实际上应该没有显着的额外费用。

答案 2 :(得分:0)

您不能以任何通用方式反转发电机。唯一的解决方案是将其转换为序列,并以相反的顺序迭代序列。在计算出先前的生成器之前,不一定要知道生成器的后期术语。

以下解决方案使用 reverse 。如果目录结构不深,性能应该没问题。

import os

directory = '/your/dir/'
for root, dirs, files in reversed(list(os.walk(directory))):
    print root, dirs, files