如何使用Python获取目录下以KB为单位的图片文件大小
图片信息提取脚本问题修复
问题描述
需求为批量提取指定目录下图片的名称、分辨率、以KB为单位的磁盘文件大小并写入CSV文件。原有代码可正常获取图片名称与分辨率,但size字段返回的是像素相关数值,不符合磁盘文件大小的获取需求。
问题根因
原有代码中使用的img.size是OpenCV读取图像后生成的numpy数组的元素总个数,计算逻辑为图像高度 * 图像宽度 * 通道数,属于图像像素维度的统计值,和文件在磁盘上的实际存储大小无关。
修复后完整代码
# 导入依赖库 from os import listdir from os.path import isfile, join, getsize, exists from pathlib import Path import cv2 import argparse import csv # 初始化CSV文件路径 csv_path = Path("csv/details.csv") # 若csv目录不存在则自动创建 csv_path.parent.mkdir(exist_ok=True) # 判断CSV文件是否存在,不存在则写入表头 if not exists(csv_path): with open(csv_path, 'w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(["S.No.", "Name", "Resolution", "Size"]) # 配置命令行参数获取图片目录路径 ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required=True, help="图片文件夹路径") args = vars(ap.parse_args()) mypath = args["image"] # 遍历目录下所有文件 onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))] # 支持的图片格式后缀 img_suffix = ('.jpg', '.jpeg', '.png', '.bmp', '.tiff', '.webp') for idx, filename in enumerate(onlyfiles): path = join(mypath, filename) # 过滤非图片文件,避免读取报错 if not filename.lower().endswith(img_suffix): continue # 读取图片获取分辨率 img = cv2.imread(path, cv2.IMREAD_UNCHANGED) if img is None: continue h, w = img.shape[:2] resolution = f"{h} X {w}" # 获取磁盘文件大小,转换为KB单位,保留2位小数 file_size_kb = round(getsize(path) / 1024, 2) size = f"{file_size_kb} KB" # 结果写入CSV with open(csv_path, 'a', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow([idx+1, filename, resolution, size])
关键修改说明
- 移除原代码中错误的
img.size像素统计逻辑,使用标准库os.path.getsize()直接读取文件在磁盘上的实际字节数,按1KB=1024字节换算为KB单位,结果保留2位小数 - 修复原代码CSV初始化逻辑bug:原代码在文件已存在时先用
w+模式清空文件,再用追加模式写入表头,易造成数据丢失、表头重复问题,调整为仅当CSV文件不存在时才写入表头 - 移除重复导入的numpy、重复读取图片的冗余代码,删除with语句块内多余的手动文件关闭操作(上下文管理器会自动完成文件资源释放)
- 增加图片格式过滤、图片读取失败判断逻辑,避免目录下存在非图片文件、损坏图片时脚本运行中断
- 增加csv目录自动创建逻辑,省去手动创建目录的步骤,同时指定文件编码为utf-8避免中文乱码
内容的提问来源于stack exchange,提问作者Keerthi Kamarthi
相关产品推荐
相关产品推荐

