如何利用Path.iterdir()返回的路径调用rglob()扫描文件?
解决方法
核心错误原因
你的代码报错是因为Path.rglob('*.PNG')返回的是路径生成器(批量生成符合条件的Path对象),而不是单个路径,直接把生成器传给PurePath构造函数会触发类型错误。另外,主目录下存在zip文件(非目录项),遍历这些文件调用rglob也没有意义。
修正后的代码
以下是可以正常运行的代码,同时处理了zip文件过滤和生成器遍历的问题:
from pathlib import Path # 挂载谷歌云盘 drive.mount('/content/drive') # 定义根目录路径 root_dir = Path('/content/drive/MyDrive/Cape-Windy/Annotated-frames_COCO/') # 遍历根目录下的所有子目录,跳过非目录文件(比如zip) for sub_dir in root_dir.iterdir(): # 只处理目录项 if not sub_dir.is_dir(): continue # 遍历当前子目录下所有PNG文件(包括子子目录中的) for png_path in sub_dir.rglob('*.PNG'): # 直接获取PNG文件的文件名(不带后缀) print(png_path.stem)
关键说明
sub_dir.is_dir():过滤掉根目录下的zip等非目录文件,只处理真正的子目录,避免无效遍历sub_dir.rglob('*.PNG'):生成当前子目录下所有层级的PNG文件路径,必须通过循环逐个取出路径对象png_path.stem:每个Path实例自带stem属性,直接获取文件名(无需额外用PurePath包装,因为rglob返回的已经是Path对象)
简化写法
如果不需要单独处理每个子目录,也可以直接在根目录用rglob批量匹配子目录下的PNG:
root_dir = Path('/content/drive/MyDrive/Cape-Windy/Annotated-frames_COCO/') # 匹配所有子目录下的PNG文件(排除根目录直接存放的PNG) for png_path in root_dir.rglob('*/**.PNG'): print(png_path.stem)
内容的提问来源于stack exchange,提问作者Observarun
相关产品推荐
相关产品推荐

