需求:将文件夹中多张JPG图片转Base64后合并为单个JSON文件
批量将JPG转Base64并合并为JSON的完整实现
你提供的代码已经有了核心思路,但有几个关键问题需要修正(比如空键名会覆盖数据、目录处理不够严谨),下面是完善后的完整代码,同时我会解释关键细节:
import base64 import json import os # 定义图片文件夹和输出JSON的路径 image_directory = 'C:/users/user/desktop/k-means/image' output_json = 'C:/users/user/desktop/k-means/words.json' # 存储所有图片的Base64数据,键用文件名区分 image_data = {} # 遍历文件夹中的文件 for file_name in os.listdir(image_directory): # 只处理JPG/JPEG格式的图片 if file_name.lower().endswith(('.jpg', '.jpeg')): # 拼接完整的文件路径,避免切换目录带来的问题 full_path = os.path.join(image_directory, file_name) # 使用with上下文管理器自动关闭文件,更安全 with open(full_path, 'rb') as img_file: # 读取图片字节并编码为Base64字符串 img_bytes = img_file.read() base64_str = base64.b64encode(img_bytes).decode('ascii') # 用文件名作为JSON的键,这样后续能对应到具体图片 image_data[file_name] = base64_str # 将数据写入JSON文件,添加indent让格式更清晰 with open(output_json, 'w', encoding='utf-8') as json_file: json.dump(image_data, json_file, indent=4) print(f"处理完成!已生成JSON文件:{output_json}")
关键改进说明:
- 避免目录切换风险:原代码用
os.chdir切换工作目录,后续操作容易出错。改用os.path.join拼接完整路径,更可靠。 - 解决数据覆盖问题:原代码里
data[""] = ...用空字符串作为键,每循环一次就会覆盖之前的数据,最终JSON里只会保留最后一张图片。现在用文件名作为键,所有图片数据都会被保留。 - 使用推荐的编码方法:
base64.encodestring是旧版API,现在官方推荐用base64.b64encode,功能一致但更规范。 - 过滤图片格式:只处理JPG/JPEG文件,避免读取文件夹里的其他无关文件(比如临时文件、文档)。
- 自动管理文件资源:用
with语句打开文件,无需手动调用close(),防止资源泄漏。 - 格式化JSON输出:
indent=4让生成的JSON文件有缩进,可读性更强。
可选扩展:
- 如果需要处理PNG、GIF等其他图片格式,只需修改后缀判断条件:
file_name.lower().endswith(('.jpg', '.jpeg', '.png', '.gif')) - 如果要递归处理子文件夹里的图片,可以把
os.listdir换成os.walk,遍历所有层级的文件:for root, dirs, files in os.walk(image_directory): for file_name in files: if file_name.lower().endswith(('.jpg', '.jpeg')): full_path = os.path.join(root, file_name) # 后续处理逻辑不变 - 注意:Base64编码会让文件体积比原图片大大约30%,如果图片数量多或体积大,要考虑JSON文件的存储和传输成本。
内容的提问来源于stack exchange,提问作者이수진
相关产品推荐
相关产品推荐

