如何使用glob.iglob仅获取包含.log文件的文件夹名称?
问题:提取包含.log文件的相对文件夹路径
我用以下代码递归查找所有后缀为.log的文件:
glob.iglob(f"{ROOT}/**/*.log", recursive = True)
但这个代码返回的是带完整路径的迭代器,我只想要相对于ROOT的文件夹名称,而不是文件的完整路径。
我的目录结构如下:
<ROOT>/ ├── a/ │ ├── a.log ├── b/ │ └── b.log ├── c/ │ ├── c.log │ └── cd/ │ └── cd.log
期望得到的结果是:
['a', 'b', 'c', 'c/cd']
请问该怎么实现?
解决方案
可以结合os.path模块处理路径,再通过集合去重,最终得到目标结果。示例代码如下:
import glob import os ROOT = "/your/actual/root/path" unique_folders = set() # 遍历所有.log文件的完整路径 for full_file_path in glob.iglob(f"{ROOT}/**/*.log", recursive=True): # 提取文件所在的文件夹完整路径 folder_full_path = os.path.dirname(full_file_path) # 转换为相对于ROOT的相对路径 relative_folder = os.path.relpath(folder_full_path, ROOT) # 加入集合自动去重 unique_folders.add(relative_folder) # 转换为排序后的列表(保持目录结构顺序) result = sorted(unique_folders) print(result)
关键步骤说明:
os.path.dirname(full_file_path):从文件的完整路径中剥离出所在文件夹的路径os.path.relpath(...):将绝对文件夹路径转换为相对于ROOT的相对路径,自动处理层级关系- 使用
set存储路径:避免同一文件夹下有多个.log文件时重复添加 sorted():让最终列表按目录结构排序,和你期望的输出格式一致
运行这段代码后,就能得到你需要的['a', 'b', 'c', 'c/cd']结果。
内容的提问来源于stack exchange,提问作者Tony Montana
相关产品推荐
相关产品推荐

