Python循环中如何递增文件索引?多文件夹图片重构原图需求
问题解决思路与修正代码
你的核心问题是用内层循环+break的方式只能拿到每个文件夹的第一张图,没法对应外层循环im的索引去取第2、3、4张。直接通过索引取值就能解决这个问题,不用再用内层循环遍历。
关键修改点:
- 删掉遍历
image_list的内层循环,直接用image_list[im]获取当前原图对应的切片(因为外层im从0到3,正好对应每个文件夹里排序后的第1到第4张图) - 修正
x0 =+ w2的笔误,改成x0 += w2(否则x0会被直接赋值为w2,而不是累加) - 优化保存的文件名,去掉多余的
str(i),让文件名直接对应原图序号(比如output_1.png对应第一张原图) - 增加判断,确保每个文件夹里至少有4张图,避免索引越界报错
修正后的代码:
from PIL import Image from natsort import natsorted import os image_path = "heat_map/" w1 = 2560 h1 = 2048 dir_list = natsorted(os.listdir(image_path)) # 创建输出目录(如果不存在) os.makedirs("output", exist_ok=True) for im in range(4): output_image = Image.new(mode="RGBA", size=(w1, h1), color="black") i = 0 x0 = 0 y0 = 0 for folder in dir_list: i += 1 folder_path = os.path.join(image_path, folder) image_list = natsorted(os.listdir(folder_path)) # 确保文件夹里有足够的图片,避免索引越界 if len(image_list) <= im: print(f"警告:文件夹 {folder} 中图片数量不足,跳过") continue # 直接通过im索引获取对应切片,不用内层循环 piece_filename = image_list[im] piece_path = os.path.join(folder_path, piece_filename) piece = Image.open(piece_path) w2, h2 = piece.size output_image.paste(piece, (x0, y0)) piece.close() # 调整下一个切片的位置 if i == 3: x0 += w2 y0 = 0 continue y0 += h2 if y0 < h1: continue x0 += w2 y0 = 0 # 保存图片,文件名对应原图序号(1-4) output_image.save(f"output/output_{im+1}.png") output_image.close()
说明:
- 外层循环
im控制当前要拼接的是第几张原图,从0到3对应4张原图 - 每个文件夹里的图片经过
natsorted排序后,用image_list[im]直接拿到对应位置的切片,完美匹配每张原图的拼接需求 - 增加了
os.makedirs("output", exist_ok=True),避免输出目录不存在时报错 - 增加的图片数量判断,能提前发现异常文件夹,防止程序崩溃
内容的提问来源于stack exchange,提问作者eduarfa
相关产品推荐
相关产品推荐

