如何导出Python字典到JSON文件时让每个键值对单独占行且列表不换行
解决方案
Python 内置 json 模块的 indent 参数会对所有嵌套结构统一应用换行缩进,无法单独控制列表不换行,以下两种方案均不依赖第三方库:
方案1:手动拼接JSON(适合顶层字典值均为一维列表的场景)
逻辑是单独序列化每个列表为单行字符串,再手动拼接成完整JSON结构,结果完全可控:
import json d = {"car": ["toyota", "honda"], "bus": ["hackney", "bombardier"]} indent_space = " " # 对应你需要的缩进空格数,示例为3个空格 kv_lines = [] for key, value_list in d.items(): # 序列化列表为无换行的JSON字符串 list_json = json.dumps(value_list) kv_lines.append(f'{indent_space}"{key}": {list_json}') # 拼接完整JSON,自动补充键值对之间的逗号,保证JSON合法性 final_json = "{\n" + ",\n".join(kv_lines) + "\n}" # 写入文件 with open("output.json", "w", encoding="utf-8") as f: f.write(final_json)
输出效果:
{ "car": ["toyota", "honda"], "bus": ["hackney", "bombardier"] }
方案2:正则格式化(适合存在嵌套、所有列表均需单行展示的场景)
先用indent生成带换行的标准格式化JSON,再通过正则把列表内部的换行和多余空格替换为单个空格:
import json import re d = {"car": ["toyota", "honda"], "bus": ["hackney", "bombardier"]} # 先生成带缩进的原始JSON raw_json = json.dumps(d, indent=3, ensure_ascii=False) # 正则匹配所有方括号包裹的列表内容,替换内部空白 processed_json = re.sub( r"\[(.+?)\]", lambda match: "[" + re.sub(r"\s+", " ", match.group(1)) + "]", raw_json, flags=re.DOTALL ) # 写入文件 with open("output.json", "w", encoding="utf-8") as f: f.write(processed_json)
注意:你示例中给出的期望输出缺少键值对之间的逗号,属于非法JSON格式,上述两种方案生成的结果会自动补充逗号,符合JSON规范。
内容的提问来源于stack exchange,提问作者markovv.sim
相关产品推荐
相关产品推荐

