首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反向的os.walk()?

反向的os.walk()?
EN

Stack Overflow用户
提问于 2012-01-30 18:41:24
回答 3查看 7.9K关注 0票数 11

当我运行os.walk()时,我得到的结果是字母数字顺序的;从0开始,以z结束。是否有可能颠倒这一顺序?

因此,如果我有3个目录:apple/bananas/pears/,我希望返回pears/bananas/apples/

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-30 18:47:57

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

话虽如此,您可以选择遍历子目录的顺序,方法是将topdown设置为默认值(True),然后就地对dirs进行排序:

代码语言:javascript
复制
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时,调用者可以就地修改目录名称列表(可能使用del或切片分配),并且walk()将只递归到名称保留在dirnames中的子目录;这可用于删除搜索,强制特定的访问顺序,甚至在再次恢复walk()之前通知walk()调用者创建或重命名的目录。

票数 20
EN

Stack Overflow用户

发布于 2012-01-30 18:54:39

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

特别是,您可以删除目录,或重新排序列表。

代码语言:javascript
复制
import os
for root, dirs, files in os.walk(startdir):
    dirs.sort(reverse=True)
    # Also remove dirs you do not need!

实际上应该在没有显著额外成本的情况下做到这一点。

票数 4
EN

Stack Overflow用户

发布于 2012-01-30 18:52:02

您不能以任何通用方式反转生成器。唯一的解决方案是将其转换为一个序列,并以相反的顺序迭代该序列。在计算出较早的项之前,不一定知道生成器的较新项。

下面的解决方案使用了反向。如果目录结构不是很深,性能应该是不错的。

代码语言:javascript
复制
import os

directory = '/your/dir/'
for root, dirs, files in reversed(list(os.walk(directory))):
    print root, dirs, files
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9062601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档