【问题标题】:Recursively iterate through all subdirectories using pathlib使用 pathlib 递归遍历所有子目录
【发布时间】:2018-11-15 18:56:40
【问题描述】:

如何使用pathlib 递归迭代给定目录的所有子目录?

p = Path('docs')
for child in p.iterdir(): child

似乎只遍历给定目录的直接子级。

我知道 os.walk()glob 可以做到这一点,但我想使用 pathlib,因为我喜欢使用路径对象。

【问题讨论】:

    标签: python python-3.x pathlib


    【解决方案1】:

    使用Path.rglob(替换Path().glob("**/*")中的前导**):

    path = Path("docs")
    for p in path.rglob("*"):
         print(p.name)
    

    【讨论】:

      【解决方案2】:

      您可以使用Path 对象的glob 方法:

      p = Path('docs')
      for i in p.glob('**/*'):
           print(i.name)
      

      【讨论】:

      • 还有一个rglob方法,就是在pattern前面加上**/,所以可以改成p.rglob('*')
      • 是的,根据下面@pylang 的回答。认为更新我的更新是不礼貌的,因为他到目前为止取得了很好的成功。
      • 你有正直的性格@JacquesGaudin。干杯。
      【解决方案3】:

      pathlibglob 方法,我们可以在其中提供模式作为参数。

      例如:Path('abc').glob('**/*.txt') - 它将递归查找当前文件夹 abc 和所有其他子目录以定位所有 txt 文件。

      【讨论】:

        【解决方案4】:

        要查找文件夹,正确的 glob 字符串是:

        '**/'
        

        因此,要查找路径中所有文件夹的所有路径,请执行以下操作:

        p = Path('docs')
        for child in p.glob('**/'):
            print(child)
        

        如果您只想要没有路径的文件夹名称,那么打印文件夹的名称,如下所示:

        p = Path('docs')
        for child in p.glob('**/'):
            print(child.name)
        

        【讨论】:

          【解决方案5】:

          使用列表推导:

          (1) [f.name for f in p.glob("**/*")]  # or
          (2) [f.name for f in p.rglob("*")]
          

          如果您想分别仅定位文件或仅定位目录,则可以将if f.is_file()if f.is_dir() 添加到 (1) 或 (2)。或者如果您只想定位.txt 文件,则将"*" 替换为"*.txt" 之类的模式。

          快速查看guide

          【讨论】:

          • 使用列表理解有什么意义?这如何补充现有答案?
          • 我正在查看打印结果的其他答案,因此我提供了它作为替代方案。但你是对的,原始帖子并没有明确说明它是需要的。
          猜你喜欢
          • 2011-12-24
          • 1970-01-01
          • 2012-03-10
          • 2019-06-24
          • 1970-01-01
          • 2018-10-15
          • 2019-04-29
          • 2013-06-01
          • 2012-04-07
          相关资源
          最近更新 更多