You need to enable JavaScript to run this app. 使用Python更新JSON文件列表时如何保持原有自定义缩进格式
优惠活动
大模型
产品
解决方案
定价
更多

使用Python更新JSON文件列表时如何保持原有自定义缩进格式

问题根源

格式错乱是Python原生json.dump的默认机制导致的:传入indent参数后,库会对所有层级的列表、字典做逐元素缩进拆分,根本不支持你需要的“外层按固定缩进、内层行列表强制单行”的自定义排版要求。
同时现有代码里还有一行完全冗余的无效逻辑:data.update(data) 是用字典自身的值更新自身,不会产生任何实际效果。

调整方案

不需要引入第三方依赖,只需要两步就能完全匹配你要的JSON格式:

1. 修正原有数据读写的冗余逻辑

先把多余代码删掉,保证数据修改的逻辑正确:

import json

# 读取原有关卡数据
with open("./world_data.json", "r", encoding="utf-8") as f:
    data = json.load(f)

# 定位修改对应位置的方块值
target_level = data[world.level_name]
target_level[button[1][3][1]][button[1][3][0]] = 0

2. 实现匹配格式要求的自定义序列化逻辑

原生json.dump没法满足排版要求,你可以手写一个专门适配关卡JSON结构的格式化函数,完全按照你要的规则生成文本:

def format_level_file(data, base_indent=2):
    """
    适配关卡文件格式:
    - 外层字典键值对按2空格缩进
    - 每个存储单行方块的一维列表强制单行展示
    """
    def gen_indent(level):
        return " " * base_indent * level

    content = ["{"]
    all_levels = list(data.keys())

    for level_idx, level_name in enumerate(all_levels):
        level_rows = data[level_name]
        # 写入关卡名对应的外层键
        content.append(f'{gen_indent(1)}"{level_name}": [')
        # 逐行写入方块数据,每个行列表单独占一行
        for row_idx, row in enumerate(level_rows):
            row_text = json.dumps(row)
            line_comma = "," if row_idx != len(level_rows) - 1 else ""
            content.append(f'{gen_indent(2)}{row_text}{line_comma}')
        # 写入二维列表的闭合括号
        close_comma = "," if level_idx != len(all_levels) -1 else ""
        content.append(f'{gen_indent(1)}]{close_comma}')

    content.append("}")
    return "\n".join(content)

3. 用自定义格式写入文件

把原来的json.dump替换成自定义的格式化输出即可:

with open("./world_data.json", "w", encoding="utf-8") as f:
    f.write(format_level_file(data))

最终效果

生成的JSON文件会完全符合人工阅读要求:

  • 外层所有键统一按2空格缩进
  • 每一行存储20个方块值的一维列表单独占整行,不会被拆成逐元素换行
  • 没有多余空行、缩进错乱的问题,和你之前手动维护的文件格式完全一致

内容的提问来源于stack exchange,提问作者Celltox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 12:06:08