首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python的os.walk(path,topdown=false)的Ruby等价于什么?

Python的os.walk(path,topdown=false)的Ruby等价于什么?
EN

Stack Overflow用户
提问于 2016-05-06 21:05:02
回答 1查看 385关注 0票数 1

这类似于What's the Ruby equivalent of Python's os.walk?,但我感兴趣的是从叶子中遍历目录树,而不是从根目录中走出来。

的目录结构,如

代码语言:javascript
复制
/root/
|- A/
   |- a.txt
|- B/
   |- b.txt
   |- C/
      |- c.txt

考虑到root,我想按以下顺序遍历它。

  1. /root/A/a.txt
  2. /根/A
  3. /root/B/C/c.txt
  4. /根/B/C
  5. /root/B/b.txt
  6. /根/B

在遍历过程中,我需要替换文件内容并重命名文件和目录,所以这个顺序的变化是可以的。由于目录重命名,从根目录开始并不是一个吸引人的选项。

EN

回答 1

Stack Overflow用户

发布于 2016-05-10 16:48:17

虽然我最初编写了自己的解决方案(包括在下面),但我喜欢Casper的建议http://github.com/samonzeweb/walk,因为它的行为与os.walk(x, topdown=false)在Python中的行为完全一样。

我最初的解决方案如下。它的使用与os.walk()不同,因为它产生单独的文件和目录路径,而不是(path, subdirs, files)的元组。

代码语言:javascript
复制
def bottomup_path_walk(dir, &block)
  files = []
  subdirs = []
  Dir.glob(File.join(dir, "*")).each do |path_str|
    path = Pathname.new(path_str)
    if path.directory?
      bottomup_path_walk(path, &block)
      subdirs << path
    elsif path.file?
      files << path
    end
  end

  files.each   { |f| yield f }
  subdirs.each { |d| yield d }
end

给定问题中的目录树,前面的代码按照这个顺序遍历(这对于重命名文件和目录是安全的)。

  1. /root/B/C/c.txt
  2. /root/B/b.txt
  3. /根/B/C
  4. /root/B/b.txt
  5. /root/A/a.txt
  6. /根/A
  7. /根/B
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37081413

复制
相关文章

相似问题

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