
1 、环境:目录结构如下,我想排除 D:\目录\目录 1 及其子目录,
D:\目录 ├─目录 1 (排除,及其子目录) │ ├─目录 1 │ ├─目录 2 │ └─目录 3 ├─目录 2 (保留,及其子目录) │ ├─目录 1 │ ├─目录 2 │ └─目录 3 └─目录 3 (保留,及其子目录) ├─目录 1 ├─目录 2 └─目录 3 生成所有目录路径列表,想通过 if in 排除某些目录
path = r"D:\目录" allDir = [] exculdeDir=[r"D:\目录\目录 1"] for root, dirs, files in os.walk(path): for i in dirs: allDir.append(os.path.join(root, i)) for dirpath in allDir: for exculdepath in exculdeDir: if exculdepath in dirpath: allDir.remove(dirpath) for i in allDir: print(i+" res") 2 、问题: 通过这种方式,排除了 D:\目录\目录 1 ; D:\目录\目录 1\目录 1 ; D:\目录\目录 1\目录 3 ,但是不排除 D:\目录\目录 1\目录 2 ,不知道是什么原因?
1 fuge 2023-08-11 11:14:12 +08:00 chatgpt 给的答案,没有经过验证。 问题出在你在循环中修改了 allDir 列表,导致循环遍历时出现了问题。在遍历 allDir 列表的同时,你对其进行了删除操作,导致遍历的元素和列表的索引发生了混乱。 更好的方法是,在遍历 allDir 列表时,创建一个新的列表来保存排除目录后的结果,而不是在原始列表上进行修改。以下是修正后的代码: python Copy code import os path = r"D:\目录" allDir = [] exculdeDir = [r"D:\目录\目录 1"] for root, dirs, files in os.walk(path): for i in dirs: allDir.append(os.path.join(root, i)) filteredDir = [] for dirpath in allDir: exclude = False for exculdepath in exculdeDir: if exculdepath in dirpath: exclude = True break if not exclude: filteredDir.append(dirpath) for i in filteredDir: print(i + " res") 这样,你就会得到正确的排除结果。在遍历 allDir 列表时,将不符合排除条件的目录路径添加到 filteredDir 列表中,然后遍历输出 filteredDir 列表,得到正确的排除结果。 |
2 NoOneNoBody 2023-08-11 11:17:06 +08:00 1.不要在循环中改变循环的目标,问题可能出在这里 2.建议用 os.scandir ,可以一边递归一边排除,不用跑两遍循环 3.如果搜索完再集中处理,有 pandas 模块的话,用 panadas.series.str 相关函数向量化处理更快,当然 allDir 数量少就不必了 |
3 deplivesb 2023-08-11 11:19:50 +08:00 列表不要一边便利一边删除 |
4 nuk 2023-08-11 12:10:46 +08:00 for dirpath in allDir[:]: |
5 zhzy 2023-08-11 13:18:56 +08:00 glob 了解一下 |
6 dgzting OP 感谢各位支持,已解决问题,是遍历中同时删除导致 |
7 dgzting OP @NoOneNoBody 感谢,已解决问题,同时感谢提供一些其他思路 |