python - 使用glob递归获取终端子目录

标签 python glob

我有一系列包含文件的子目录:

/cars/ford/escape/sedan/
/cars/ford/escape/coupe/
/cars/ford/edge/sedan/
/cars/ferrari/testarossa/
/cars/kia/soul/coupe/

等等。

我想使用 glob(在 Python 中)从根目录 /cars/ 获取所有这些终端子目录路径,但不包括任何其中的文件,也不是子目录的任何父目录。每个目录仅包含文件,没有其他子目录。

我尝试使用glob("**/"),但这也会返回/cars/ford//cars/ford/escape//cars/ford/edge/cars/ferrari/ 等。我不想要这些。

我还尝试使用rglob("*/"),但这也会返回终端子目录内的所有文件。

我可以通过通配文件并从其 parent 中制作一组来获得我需要的东西,但我觉得必须从全局方面对此有一个优雅的解决方案。不幸的是,我似乎无法找到合适的搜索词来发现它。谢谢!

最佳答案

glob 是这项工作的错误工具:传统的 POSIX-y glob 表达式不支持任何类型的否定断言(extglobs 支持,但它仍然是一种限制性的支持——进行断言关于个人名称,而不是同一文件系统上存在或不存在的内容——这不适用于您的用例,而且 Python 无论如何也不支持它们)。 os.walk() 及其较新的子项更适合。

假设您使用的是足够新的 Python 来支持 pathlib.Path.walk() :

import pathlib

def terminal_dirs(parent):
    for root, dirs, files in pathlib.Path(parent).walk():
        if not dirs:
            yield root

对于旧版本的 Python,可以类似地使用 os.walk():

import os

def terminal_dirs(parent):
    for dirpath, dirnames, filenames in os.walk(parent):
        if not dirnames:
            yield dirpath

如果匆忙的话,这两个当然可以折叠成一行字:

result = [ r for (r,d,f) in os.walk('/cars') if not d ]

关于python - 使用glob递归获取终端子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77487996/

相关文章:

javascript - 用于下载文件的flask html链接

python - 如何创建一个 python 脚本,以便在目录中的 csv 文件在过去 24 小时内未更新时发送电子邮件?

python - 进入子目录、运行命令然后返回的最优雅的方式是什么?

php - glob 函数中的 RegEx 模式

c# - 如何从包含通配符的目录路径获取 C# 中的文件列表?

python : scrapy using proxy IP

python - 可用于日志格式的调用堆栈

python - gitpython ssh 密码

PHP - 不区分大小写的文件搜索

python - Python 中的模块路径