You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JSON/YAML文件中复制0-100取值范围的重复值

配置文件0-100数值重复复制实现方案

处理YAML和JSON的核心逻辑一致:先解析配置结构,递归遍历所有节点定位0~100区间的数值,按需求执行复制操作后回写文件即可,不需要复杂的工具链,用Python几十行代码就能搞定。

YAML文件处理

用PyYAML库做解析和回写,先安装依赖:
pip install pyyaml

实现步骤:

  • 用yaml.safe_load加载YAML文件,避免不安全的标签执行,加载时指定utf-8编码防止中文乱码
  • 递归遍历所有字典、列表、单值节点,判断节点值如果是int/float类型且落在0~100闭区间,就按你的复制规则处理
  • 处理完成后用yaml.dump回写,设置sort_keys=False保留原有键的顺序,不要打乱原配置结构

可直接复用的代码示例:

import yaml

def process_yaml(input_file, output_file, copy_count=2):
    # 读取原配置
    with open(input_file, 'r', encoding='utf-8') as f:
        config = yaml.safe_load(f)

    # 递归遍历节点
    def traverse(node):
        if isinstance(node, dict):
            return {key: traverse(value) for key, value in node.items()}
        elif isinstance(node, list):
            res = []
            for item in node:
                processed = traverse(item)
                # 命中0-100数值就复制指定份数追加到列表
                if isinstance(processed, (int, float)) and 0 <= processed <= 100:
                    res += [processed] * copy_count
                else:
                    res.append(processed)
            return res
        elif isinstance(node, (int, float)) and 0 <= node <= 100:
            # 单值场景默认返回重复值组成的列表,可根据你的实际复制规则修改
            return [node] * copy_count
        return node

    final_config = traverse(config)
    # 回写新文件
    with open(output_file, 'w', encoding='utf-8') as f:
        yaml.dump(final_config, f, allow_unicode=True, sort_keys=False)

# 调用示例:把test.yaml里的0-100数值都复制2份,输出到test_out.yaml
# process_yaml("test.yaml", "test_out.yaml", copy_count=2)

如果需要保留YAML里的原有注释,把PyYAML换成ruamel.yaml即可,遍历和处理逻辑完全不用改。

JSON文件处理

JSON是Python原生支持的格式,不需要安装额外依赖,处理逻辑和YAML几乎完全一致,只需要把加载、回写方法换成json模块的对应方法即可。

实现步骤:

  • 用内置json.load加载JSON文件
  • 节点遍历、数值判断、复制逻辑和YAML版本通用
  • 回写时用json.dump,设置indent=2保留原有的格式化缩进,ensure_ascii=False避免中文转义

可直接复用的代码示例:

import json

def process_json(input_file, output_file, copy_count=2):
    # 读取原配置
    with open(input_file, 'r', encoding='utf-8') as f:
        config = json.load(f)

    # 递归遍历逻辑和YAML版本完全一致
    def traverse(node):
        if isinstance(node, dict):
            return {key: traverse(value) for key, value in node.items()}
        elif isinstance(node, list):
            res = []
            for item in node:
                processed = traverse(item)
                if isinstance(processed, (int, float)) and 0 <= processed <= 100:
                    res += [processed] * copy_count
                else:
                    res.append(processed)
            return res
        elif isinstance(node, (int, float)) and 0 <= node <= 100:
            return [node] * copy_count
        return node

    final_config = traverse(config)
    # 回写新文件
    with open(output_file, 'w', encoding='utf-8') as f:
        json.dump(final_config, f, ensure_ascii=False, indent=2)

# 调用示例:把test.json里的0-100数值都复制2份,输出到test_out.json
# process_json("test.json", "test_out.json", copy_count=2)

注意:处理前务必备份原配置文件,避免逻辑写错导致原配置损坏。如果你的复制规则不是“把单值替换为重复值组成的列表”,比如是要给同层级追加同值的其他键、或者在指定字段下生成重复条目,只需要修改traverse函数里命中数值后的处理逻辑即可,加载、遍历、回写的框架不用动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:42:16