将含1300+JPEG图片的数据集转为CSV(每行一个数据点)求高效方法
高效批量将JPEG图片转换为CSV文件的方法
针对1300多张JPEG图片的转换需求,用Python实现是最快速高效的方案,以下是两种实现方式(单进程/多进程),可根据你的需求选择:
准备工作
先安装必要的依赖库:
pip install pillow numpy
多进程版本无需额外安装,Python自带multiprocessing模块。
方案1:单进程基础版(稳定易调试)
适合图片数量不多、或者需要逐行调试的场景,代码逻辑清晰,内存占用可控:
import os import csv from PIL import Image import numpy as np def images_to_csv(image_folder, output_csv, grayscale=True, target_size=None): # 筛选文件夹内所有JPEG格式图片 image_paths = [ os.path.join(image_folder, filename) for filename in os.listdir(image_folder) if filename.lower().endswith(('.jpg', '.jpeg')) ] if not image_paths: print("未找到任何JPEG图片") return # 确定输出的特征维度(以第一张图片为基准) with Image.open(image_paths[0]) as img: if target_size: img = img.resize(target_size) if grayscale: img = img.convert('L') flat_dim = np.array(img).size # 写入CSV文件 with open(output_csv, 'w', newline='', encoding='utf-8') as csv_file: writer = csv.writer(csv_file) # 写入表头:像素列 + 原文件名(方便后续对应) headers = [f'pixel_{i}' for i in range(flat_dim)] + ['original_filename'] writer.writerow(headers) # 逐张处理图片并写入 for img_path in image_paths: try: with Image.open(img_path) as img: if target_size: img = img.resize(target_size) if grayscale: img = img.convert('L') # 将图片转为一维数组并转为列表 flat_pixels = np.array(img).flatten().tolist() # 拼接像素数据和文件名 writer.writerow(flat_pixels + [os.path.basename(img_path)]) except Exception as e: print(f"跳过损坏图片 {img_path}: {str(e)}") # 替换为你的实际路径 images_to_csv( image_folder="你的图片文件夹路径", output_csv="output_images.csv", grayscale=True, # 设为False保留RGB三色通道 target_size=(224, 224) # 若图片尺寸不统一,设置统一大小,比如(224,224) )
方案2:多进程加速版(处理大数量图片更快)
利用CPU多核心并行处理,能大幅缩短1300张图片的转换时间:
import os import csv from PIL import Image import numpy as np from multiprocessing import Pool def process_single_image(params): img_path, grayscale, target_size = params try: with Image.open(img_path) as img: if target_size: img = img.resize(target_size) if grayscale: img = img.convert('L') flat_pixels = np.array(img).flatten().tolist() return flat_pixels + [os.path.basename(img_path)] except Exception as e: print(f"跳过损坏图片 {img_path}: {str(e)}") return None def images_to_csv_parallel(image_folder, output_csv, grayscale=True, target_size=None, num_processes=4): image_paths = [ os.path.join(image_folder, filename) for filename in os.listdir(image_folder) if filename.lower().endswith(('.jpg', '.jpeg')) ] if not image_paths: print("未找到任何JPEG图片") return # 确定特征维度 with Image.open(image_paths[0]) as img: if target_size: img = img.resize(target_size) if grayscale: img = img.convert('L') flat_dim = np.array(img).size # 构造多进程参数 process_params = [(path, grayscale, target_size) for path in image_paths] # 并行处理所有图片 with Pool(num_processes) as pool: results = pool.map(process_single_image, process_params) # 过滤掉处理失败的结果 valid_results = [res for res in results if res is not None] # 写入CSV with open(output_csv, 'w', newline='', encoding='utf-8') as csv_file: writer = csv.writer(csv_file) headers = [f'pixel_{i}' for i in range(flat_dim)] + ['original_filename'] writer.writerow(headers) writer.writerows(valid_results) # 调用示例 images_to_csv_parallel( image_folder="你的图片文件夹路径", output_csv="output_images_parallel.csv", grayscale=True, target_size=(224, 224), num_processes=4 # 根据你的CPU核心数调整,比如8核设为6或8 )
关键注意事项
- 图片尺寸统一:如果你的图片尺寸不一致,必须设置
target_size参数将所有图片缩放到统一大小,否则CSV每行的列数不同会导致格式错误。 - 灰度/ RGB选择:转灰度图会将数据量减少到原来的1/3,处理速度更快、CSV文件更小;若需要保留颜色信息,将
grayscale设为False即可。 - 异常处理:代码中加入了错误捕获,会自动跳过损坏的图片,避免程序中断。
内容的提问来源于stack exchange,提问作者zulqarnain17101
相关产品推荐
相关产品推荐

