如何查找路径中不含.ts文件夹的叶子目录?
需求说明
我有一套文件夹结构,最底层的非.ts文件夹里存着epub和json文件。目前正在通过创建带.ts的文件夹(里面放导出标签用的json文件),把原json里的标签导入TagSpaces。已经处理了一部分文件,现在需要找出路径里不包含.ts文件夹的叶子目录,用来定位还没处理的文件,避免重复操作。
举个例子,下面的目录结构里,只有t5是需要处理的:
test ├── t1 │ ├── t2 │ │ └── t5 │ └── t3 │ └── .ts └── .ts └── t4
尝试过的代码
我写了一段代码,但运行有问题:
import os import shutil def process_files_in_leaf_subdirectories(dir: str) -> None: dirs = [] for root, subdirs, filenames in os.walk(dir): if subdirs or '.ts' in root: continue dirs.append(root) return dirs def test_process_files_in_leaf_subdirectories(): os.makedirs('tmp/t1/t2/t5', exist_ok=True) os.makedirs('tmp/t1/t3/.ts', exist_ok=True) os.makedirs('tmp/.ts/t4', exist_ok=True) assert get_files_in_leaf_subdirectories('tmp') == ['tmp/t1/t2/t5'] shutil.rmtree('tmp')
问题修正
这段代码有两个明显问题:
- 函数名不匹配:测试函数里调用的是
get_files_in_leaf_subdirectories,但定义的函数是process_files_in_leaf_subdirectories - 逻辑判断错误:原代码会跳过所有有子目录的目录,但如果子目录只有
.ts,那当前目录其实已经是处理过的,不需要纳入;同时原代码用.ts in root会误判名称带ts的目录
修正后的代码如下:
import os import shutil def get_files_in_leaf_subdirectories(base_dir: str) -> list[str]: target_dirs = [] for root, subdirs, _ in os.walk(base_dir): # 跳过路径中包含.ts文件夹的目录 if '.ts' in root.split(os.sep): continue # 过滤掉子目录中的.ts文件夹 non_ts_subdirs = [d for d in subdirs if d != '.ts'] # 没有非.ts的子目录,说明是待处理的叶子目录 if not non_ts_subdirs: target_dirs.append(root) return target_dirs def test_process_files_in_leaf_subdirectories(): os.makedirs('tmp/t1/t2/t5', exist_ok=True) os.makedirs('tmp/t1/t3/.ts', exist_ok=True) os.makedirs('tmp/.ts/t4', exist_ok=True) assert get_files_in_leaf_subdirectories('tmp') == ['tmp/t1/t2/t5'] shutil.rmtree('tmp')
修正点说明
- 用
root.split(os.sep)拆分路径,精准判断是否包含.ts文件夹,避免名称含ts的目录被误排除 - 先过滤子目录里的
.ts,再判断是否还有其他子目录,确保只收集真正未处理的叶子目录
内容的提问来源于stack exchange,提问作者user19924240
相关产品推荐
相关产品推荐

