Python中os.walk先返回空列表再返回实际列表的问题如何修复?
问题原因
- 你的
print(compiled_subgal_file_paths)语句写在了os.walk的循环体内,os.walk会从你传入的根目录wk开始逐层遍历,第一轮遍历的是根目录本身,如果根目录下没有符合要求的文件,此时compiled_subgal_file_paths还没有被塞入有效内容,就会先打印出空列表。 - 你所有的累计列表
subgal_path、raw_subgal_file_paths、compiled_subgal_file_paths都是在循环外定义的,每次循环只会往里面追加内容,第二轮遍历到子目录images5时,才会把有效文件路径追加进去,第二次打印就输出了完整内容。
另外你现在遍历subdirectories时直接调用remove的写法存在隐患:遍历列表的同时修改列表会导致索引错位,可能漏过部分需要过滤的目录。
修复方案
方案1:遍历完所有目录后统一输出(最常用)
把print语句移到os.walk循环外即可,同时优化子目录过滤的写法:
# 初始化累计列表放在循环外 subgal_path = [] raw_subgal_file_paths = [] compiled_subgal_file_paths = [] for root, subdirectories, files in os.walk(wk): # 原地过滤要忽略的目录,避免遍历修改问题 subdirectories[:] = [d for d in subdirectories if d != primary_gallery] # 追加子目录路径 for subgals in subdirectories: subgal_path.append(os.path.join(root, subgals)) # 处理当前目录下的文件 for file in sorted(files): raw_subgal_file_paths.append(os.path.join(root, file)) # 所有目录遍历完成后统一处理路径拼接 for x in raw_subgal_file_paths: split_root = raw_prim_path_length - len(x) compiled_subgal_file_paths.append(x[split_root:]) # 最后只打印一次结果 print(compiled_subgal_file_paths)
方案2:需要逐个目录输出结果
如果业务要求每处理完一个目录就输出一次该目录的结果,需要把单次目录的局部列表放在循环体内初始化,避免累计之前的内容:
for root, subdirectories, files in os.walk(wk): subdirectories[:] = [d for d in subdirectories if d != primary_gallery] # 单次目录的局部列表,每次循环重新初始化 current_raw_paths = [] current_compiled_paths = [] for subgals in subdirectories: subgal_path.append(os.path.join(root, subgals)) for file in sorted(files): current_raw_paths.append(os.path.join(root, file)) for x in current_raw_paths: split_root = raw_prim_path_length - len(x) current_compiled_paths.append(x[split_root:]) # 有内容才打印,避免输出空列表 if current_compiled_paths: print(current_compiled_paths)
内容的提问来源于stack exchange,提问作者Preston
相关产品推荐
相关产品推荐

