如何用Python向YAML文件添加part节点且不重复生成urls键?
解决Python向YAML文件添加子节点时重复生成顶级键的问题
问题说明
需要通过Python向现有YAML文件的urls节点下添加part-4及后续子节点,但当前代码每次执行都会在文件末尾新增一个独立的顶级urls键,导致YAML结构出现重复顶级节点,不符合需求。
当前Python代码:
d = {'urls':{f'part-{i}': {'updated': 16662709610, 'url': 'http://any-do0main1.com/', 'url-name': f'crl{i}.der'}} with open('test.yaml', 'a+') as yaml_file: yaml.dump(d, yaml_file, default_flow_style=False)
现有YAML内容(已出现重复urls顶级键):
urls: part-0: updated: 1666270610 url: http://any-domain1.com/ url-name: cr0.der part-1: updated: 1666270610 url: http://crl.domain/ url-name: crl1.der part-2: updated: 1666270900 url: http://crl.swisssign.net/ url-name: crl2.der urls: part-3: updated: 16662709610 url: http://any-do0main1.com/ url-name: cr3.der
问题根源
当前代码使用**追加模式(a+)**写入新构造的{'urls': ...}字典,相当于在文件末尾直接追加一段新的YAML内容,而非修改已有的urls节点。
解决方案
正确流程:读取现有YAML内容→解析为Python字典→更新urls节点→重新写入覆盖原文件。
修正后的代码
import yaml # 定义要添加的新节点数据(i可根据需求循环或动态赋值) i = 4 new_part = { f'part-{i}': { 'updated': 16662709610, 'url': 'http://any-do0main1.com/', 'url-name': f'crl{i}.der' } } try: # 读取现有YAML文件,文件为空时返回空字典 with open('test.yaml', 'r') as yaml_file: data = yaml.safe_load(yaml_file) or {} except FileNotFoundError: # 文件不存在时初始化空字典 data = {} # 确保urls节点存在,不存在则创建空字典 if 'urls' not in data: data['urls'] = {} # 向urls节点添加新的part子节点 data['urls'].update(new_part) # 将更新后的内容写入原文件(覆盖模式) with open('test.yaml', 'w') as yaml_file: yaml.dump(data, yaml_file, default_flow_style=False)
效果验证
执行修正后的代码后,YAML文件将只有一个顶级urls键,新的part-4会被添加到该节点下:
urls: part-0: updated: 1666270610 url: http://any-domain1.com/ url-name: cr0.der part-1: updated: 1666270610 url: http://crl.domain/ url-name: crl1.der part-2: updated: 1666270900 url: http://crl.swisssign.net/ url-name: crl2.der part-3: updated: 16662709610 url: http://any-do0main1.com/ url-name: cr3.der part-4: updated: 16662709610 url: http://any-do0main1.com/ url-name: crl4.der
内容的提问来源于stack exchange,提问作者Flouu
相关产品推荐
相关产品推荐

