什么';s是Python的Ruby等价物';s os.walk(路径,自上而下=false)?

什么';s是Python的Ruby等价物';s os.walk(路径,自上而下=false)?,python,ruby,Python,Ruby,这与类似,但我感兴趣的是从树叶中走回目录树,而不是从根中走出来 例如,对于目录结构,如 /root/ |- A/ |- a.txt |- B/ |- b.txt |- C/ |- c.txt 给定根,我想按以下顺序遍历它 /root/A/A.txt /根/A /root/B/C/C.txt /根目录/B/C /root/B/B.txt /根/B 我需要在遍历过程中替换文件内容并重命名文件和目录,这样就可以改变顺序了。由于目录重命名,从根目录开始不是一个吸引人的选择

这与类似,但我感兴趣的是从树叶中走回目录树,而不是从根中走出来

例如,对于目录结构,如

/root/
|- A/
   |- a.txt
|- B/
   |- b.txt
   |- C/
      |- c.txt
给定
,我想按以下顺序遍历它

  • /root/A/A.txt
  • /根/A
  • /root/B/C/C.txt
  • /根目录/B/C
  • /root/B/B.txt
  • /根/B

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

    虽然我最初为此编写了自己的解决方案(包括下面),但我更喜欢的是,它的行为与Python中的os.walk(x,toptdown=false)完全相同

    我最初的解决方案如下。它的用法不同于
    os.walk()
    ,因为它生成单独的文件和目录路径,而不是
    (路径、子目录、文件)
    的元组

    def bottomup\u path\u walk(dir和block)
    文件=[]
    细分利率=[]
    Dir.glob(File.join(Dir,“*”))。每个do | path_str|
    path=Pathname.new(path\u str)
    如果path.directory?
    自底向上\路径\步行(路径和街区)
    
    subdirs虽然我最初为此编写了自己的解决方案(包括下面),但我更喜欢的是,因为它的行为与Python中的os.walk(x,top-down=false)
    完全相同

    我最初的解决方案如下。它的用法不同于
    os.walk()
    ,因为它生成单独的文件和目录路径,而不是
    (路径、子目录、文件)
    的元组

    def bottomup\u path\u walk(dir和block)
    文件=[]
    细分利率=[]
    Dir.glob(File.join(Dir,“*”))。每个do | path_str|
    path=Pathname.new(path\u str)
    如果path.directory?
    自底向上\路径\步行(路径和街区)
    
    subdirs是什么意思?@tadman关于这个问题的公认答案指向Find模块,该模块的文档称其“支持一组文件路径的自上而下遍历”。OP要求的是相反的:自下而上的遍历。如果您只是颠倒所查找内容的列表,它可能会起作用。看情况!这里探讨了几个选项。出于兴趣,如果还有一个包含文本文件的文件夹
    /root/B/D
    ,您希望/希望发生什么?您希望从C开始,然后找到同级目录吗?您的意思是吗?@tadman关于这个问题的公认答案指向find模块,该模块的文档说明了这一点“支持自顶向下遍历一组文件路径。”OP要求的是相反的:自底向上遍历。如果你只是颠倒你找到的内容列表,这可能会起作用。这取决于!这里探讨了一些选项。出于兴趣,如果还有一个包含文本文件的文件夹
    /root/B/D
    ,你期望/希望发生什么?你希望从C开始,然后找到同级控制器吗Y
    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