You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:02:09