我有一系列包含文件的子目录:
/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/