使用json.dump保存含长列表的字典时如何避免列表元素单独换行
问题原因
Python标准库json模块的indent参数是全局生效的格式化规则,开启后会对所有嵌套结构(包括字典、列表)的每个子元素都单独换行并添加对应层级的缩进。你保存的COCO标注中segmentation、bbox都是数值组成的长列表,每个数值单独换行就会凭空产生大量无效空白行,不仅大幅提升文件体积,也会导致编辑器打开时卡顿。
你直接在Colab打印字典片段时,Python默认不会给列表元素单独换行,所以显示为紧凑的单行格式。
另外你提到的两种格式的JSON没有任何实质差异:JSON语法中的换行、缩进、空格都属于无意义的空白字符,仅用于提高可读性,不会影响数据内容,所有兼容JSON规范的解析器都可以正常读取两种格式的文件。
解决方法
推荐使用第三方高性能JSON库orjson实现需求,它的格式化规则刚好匹配你的预期,且序列化/反序列化性能远高于标准库:
- 先安装依赖:
pip install orjson - 替换原有保存代码即可:
import orjson # 注意orjson输出为bytes,所以用wb模式打开文件 with open('file.json', 'wb') as fp: # OPT_INDENT_2表示缩进2空格,自动将数值列表紧凑放在同一行,字典层级正常换行缩进 fp.write(orjson.dumps(coco, option=orjson.OPT_INDENT_2))
如果不能安装第三方依赖,也可以用标准库的折中方案:先生成紧凑无缩进的JSON,再通过正则仅给字典层级添加换行缩进,跳过列表内的元素格式化,不过这种方案对结构复杂的JSON兼容性一般,适合临时使用:
import json import re compact_json = json.dumps(coco) # 正则仅匹配字典结构的分隔符,添加换行和缩进 formatted_json = re.sub(r'({"|}, "|})', r'\n\1', compact_json) with open('file.json', 'w') as fp: fp.write(formatted_json)
内容的提问来源于stack exchange,提问作者Edo Wexler
相关产品推荐
相关产品推荐

