如何移除字典外层大括号,或实现将多个字典键值对合并后写入JSON文件?
解决JSON输出结构问题:合并多个字典为单一字典
你的问题核心在于初始数据结构选错了——你用了列表来存储每个文件的字典,导致最终输出是包含多个独立字典的列表;而你需要的是一个包含所有文件键值对的单一字典。以下是具体的修正方案:
问题根源分析
原来的代码里有两个关键问题:
data = []是列表类型,每次循环用data.append(listTest)把单个文件的字典作为列表元素添加,最终形成[ {文件1}, {文件2}, ... ]的嵌套结构,这和你要的单一字典不符。size_of_img被转成了字符串,而你期望的是数字类型的文件大小。
修正后的完整代码
import os import cv2 # 初始化data为字典,而非列表 data = {} for x in range(0, len(directory_files)): # 用os.path.join拼接路径,适配不同操作系统的路径分隔符 img_path = os.path.join("Data", directory_files[x]) img_filename = directory_files[x] # 直接获取整数类型的文件大小,去掉多余的str()转换 img_size = os.stat(img_path).st_size # 生成唯一的父级键 parent_tag = img_filename + str(img_size) # 构造当前文件的完整字典结构 file_entry = { 'filename': img_filename, 'size': img_size, 'regions': [], 'file_attributes': { 'caption': '', 'public_domain': 'no', 'image_url': '' } } # 将当前文件的键值对直接存入data大字典 data[parent_tag] = file_entry # 后续写入JSON文件的示例(按需使用) # import json # with open('output.json', 'w', encoding='utf-8') as f: # json.dump(data, f, indent=4, ensure_ascii=False)
关键修改说明
- 切换数据结构:把
data从列表改为字典,这样可以直接存储多个键值对,完美匹配你想要的输出结构。 - 直接赋值键值对:不再用
append添加整个字典到列表,而是通过data[parent_tag] = file_entry,把每个文件的字典作为大字典的一个键值对存入,操作更直观高效。 - 修正文件大小类型:去掉
str()转换,让size字段保持整数类型,和你期望的输出一致。 - 路径健壮性优化:用
os.path.join拼接文件路径,避免Windows和Linux系统的路径分隔符冲突,代码更通用。
修改后,最终的data就是你想要的单一字典结构,写入JSON文件后,就能得到没有外层列表和多余大括号的目标输出。
内容的提问来源于stack exchange,提问作者sukruburakcetin
相关产品推荐
相关产品推荐

