如何在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
相关产品推荐
相关产品推荐

