Python遍历子目录文件:排除空目录与指定文件类型
问题整理
文件结构
└── artifacts ├── IMAGES │ ├── Lab1.1 │ │ ├── test1.tar.gz │ │ ├── . │ │ ├── . │ │ ├── . │ │ └── test2.txt │ └── Lab1.2 │ ├── test1_1.tar.gz │ ├── . │ ├── . │ └── test2_1.txt ├── INSTANCE │ ├── CONFIGURATION │ │ ├── CUSTOM1.json │ │ ├── CUSTOM2.json │ │ └── CUSTOM3.json
当前代码
def find_files_under_directory(self, directory_path): dir_path = os.path.dirname(os.path.realpath(__file__)) int_path = os.path.join(dir_path, directory_path) data = pathlib.Path(int_path) data.rglob("*") return list(data.rglob("*"))
需求
- 排除返回列表中的空目录;
- 排除特定类型文件(例如
.txt),同时保留列表原有顺序。
期望返回示例:
.../artifacts/IMAGES/Lab1.1/test1.tar.gz .../artifacts/IMAGES/Lab1.2/test1_1.tar.gz .../artifacts/INSTANCE/CONFIGURATION/CUSTOM1.json .../artifacts/INSTANCE/CONFIGURATION/CUSTOM2.json .../artifacts/INSTANCE/CONFIGURATION/CUSTOM3.json
修改后的代码
import os from pathlib import Path def find_files_under_directory(self, directory_path): dir_path = os.path.dirname(os.path.realpath(__file__)) int_path = os.path.join(dir_path, directory_path) root_path = Path(int_path) filtered_results = [] # 按原遍历顺序筛选 for path in root_path.rglob("*"): # 跳过所有目录(包含空目录,满足需求1) if path.is_dir(): continue # 排除指定后缀的文件(这里是.txt,满足需求2) if path.suffix.lower() == ".txt": continue filtered_results.append(path) return filtered_results
关键说明
- 目录过滤:代码直接跳过所有目录,既排除了空目录,也符合期望结果中只返回文件的要求。如果需要保留非空目录,可把目录判断逻辑改成这样:
if path.is_dir(): # 仅跳过空目录,非空目录加入结果 if not any(path.iterdir()): continue filtered_results.append(path) - 文件后缀过滤:用
path.suffix.lower()统一转小写,避免因大小写差异(比如.TXT)漏过滤; - 顺序保留:
rglob()的遍历顺序是稳定的,按原顺序遍历筛选后,结果列表的顺序和原返回结果一致。
内容的提问来源于stack exchange,提问作者Aherontas
相关产品推荐
相关产品推荐

