os.walk遍历子目录无法保存图片问题排查求助
问题排查与代码修正
咱们来一步步梳理你代码里的问题,这些应该就是导致os.walk未正常工作、图片处理功能失效的核心原因:
1. 缺少必要的导入语句
你的代码用到了os模块和PIL库的Image类,但完全没写导入代码——运行时会直接触发NameError,连基础功能都跑不起来。必须在代码最开头加上:
import os from PIL import Image
2. 缩进错误引发语法异常
最后一行的return count_em(path)缩进完全错了:它不属于count_em函数的内部代码,而且调用函数根本不需要用return,直接写count_em(path)就行。这个缩进问题会直接导致代码无法运行,这大概率是你觉得os.walk没工作的首要原因。
3. 图片保存的逻辑瑕疵
img.save(os.path.join(root, file_+''),'png')这里有两个小问题:
file_+''完全是多余的,直接用file_就行;- 如果原图片不是PNG格式,你强制指定保存格式为
png,但文件名还是原名称(比如原文件是test.jpg,保存后文件名还是test.jpg但实际是PNG格式),这会导致后续读取混乱。
如果想覆盖原文件并保持原格式,直接去掉格式参数即可;如果想强制转PNG并区分文件名,可以拆分后缀处理:
# 方案1:覆盖原文件,保留原格式 img.save(os.path.join(root, file_)) # 方案2:转PNG并重命名(比如加_resized后缀) filename, ext = os.path.splitext(file_) img.save(os.path.join(root, f"{filename}_resized.png"), 'png')
4. 关于os.walk的小优化
sorted(os.walk(path))会把os.walk返回的生成器转换成排序后的列表,这本身没问题,但如果你的文件夹层级较深,会稍慢一点。如果不需要按路径排序,直接用os.walk(path)即可:
for root, dirs, files in os.walk(path):
修正后的完整代码
另外补充两个细节:PIL 9.1.0版本之后ANTIALIAS已被弃用,推荐用Image.Resampling.LANCZOS;加上try-except可以捕获非图片文件的异常,避免程序崩溃:
import os from PIL import Image path = 'E:/Dataset_Final/Images/' def resize_images(path): # 把函数名改成更贴合功能的名字 for root, dirs, files in os.walk(path): for file_ in files: full_file_path = os.path.join(root, file_) print(f"正在处理:{full_file_path}") try: img = Image.open(full_file_path) # 统一设置32×32尺寸 img_resized = img.resize((32, 32), Image.Resampling.LANCZOS) # 覆盖原文件,保留原格式 img_resized.save(full_file_path) except Exception as e: print(f"处理文件 {full_file_path} 失败:{str(e)}") # 调用函数执行处理 resize_images(path)
内容的提问来源于stack exchange,提问作者user3768070
相关产品推荐
相关产品推荐

