You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从多级嵌套文件夹检索图片并批量获取图片尺寸?

遍历所有子文件夹并批量获取图片尺寸

看起来你已经找对工具啦——os.walk()本身就是用来递归遍历目录树的,刚好能帮你搞定所有子文件夹的图片检索!我们只需要在你现有代码的基础上做些小优化,就能完美实现你的需求。

一、先搞懂:os.walk()已经在遍历所有子文件夹了

你写的for dirpath, _, filenames in os.walk(folder_images)其实已经在递归遍历主文件夹下的所有子目录了:

  • dirpath:当前正在遍历的文件夹路径(包括所有子文件夹)
  • filenames:当前文件夹下的所有文件名
    所以核心逻辑没问题,我们只需要加上「筛选图片文件」的判断,再完善尺寸记录的细节就行。

二、完整实现代码:检索+批量获取尺寸

下面是优化后的代码,它会:

  • 自动遍历所有子文件夹
  • 只处理常见格式的图片
  • 避免重名文件覆盖记录
  • 处理损坏图片的异常情况
import os
from PIL import Image

def batch_get_image_sizes(root_folder):
    image_size_dict = {}
    # 定义需要识别的图片扩展名,可根据需求添加更多格式
    valid_extensions = ('.jpg', '.jpeg', '.png', '.bmp', '.gif')
    
    for dirpath, _, filenames in os.walk(root_folder):
        for file_name in filenames:
            # 只处理图片格式的文件,忽略大小写(比如.JPG也能识别)
            if file_name.lower().endswith(valid_extensions):
                # 拼接出图片的完整绝对路径
                full_image_path = os.path.abspath(os.path.join(dirpath, file_name))
                try:
                    with Image.open(full_image_path) as img:
                        width, height = img.size
                        # 用完整路径作为字典的键,避免不同文件夹下的重名图片覆盖数据
                        image_size_dict[full_image_path] = {'width': width, 'height': height}
                except Exception as e:
                    # 遇到损坏的图片或无法打开的文件时,打印错误信息不中断程序
                    print(f"⚠️ 无法处理图片 {full_image_path}: {str(e)}")
    return image_size_dict

# 调用示例
target_folder = "D:/DeepFashion/Category and Attribute Prediction/img/img"
all_image_sizes = batch_get_image_sizes(target_folder)

# 可以打印前5条结果验证
for img_path, size_info in list(all_image_sizes.items())[:5]:
    print(f"图片路径: {img_path} | 尺寸: {size_info['width']} × {size_info['height']}")

关键优化细节说明:

  • 图片格式筛选:通过file_name.lower().endswith(valid_extensions)确保不区分文件扩展名的大小写,兼容性更好
  • 用完整路径做键:如果不同子文件夹里有同名图片,用文件名做键会覆盖之前的记录,完整路径能保证每条数据唯一
  • 异常捕获:加入try-except块,避免遇到损坏的图片时程序直接崩溃,还能帮你定位问题文件

可选:按文件夹分组存储尺寸

如果你想按子文件夹来分类查看图片尺寸,可以把字典改成嵌套结构:

def get_image_sizes_by_folder(root_folder):
    size_by_folder = {}
    valid_extensions = ('.jpg', '.jpeg', '.png', '.bmp', '.gif')
    
    for dirpath, _, filenames in os.walk(root_folder):
        # 为每个文件夹创建一个子字典
        size_by_folder[dirpath] = {}
        for file_name in filenames:
            if file_name.lower().endswith(valid_extensions):
                full_image_path = os.path.abspath(os.path.join(dirpath, file_name))
                try:
                    with Image.open(full_image_path) as img:
                        width, height = img.size
                        size_by_folder[dirpath][file_name] = {'width': width, 'height': height}
                except Exception as e:
                    print(f"⚠️ 无法处理图片 {full_image_path}: {str(e)}")
    return size_by_folder

这样你就能清晰看到每个子文件夹下的所有图片尺寸啦!

内容的提问来源于stack exchange,提问作者Ameer Hamza

火山引擎 最新活动