MongoDB文档转YAML格式异常,需调整为适配网络自动化的规范格式
解决MongoDB文档转YAML时多余符号问题
问题场景
用以下Python代码将MongoDB文档转换为YAML文件:
from pymongo import MongoClient from bson.json_util import dumps, loads import yaml import json import ruamel.yaml client = MongoClient("localhost", 27017) database = client["movie_db"] movies = database.movies cursor = movies.find({}, { "_id": 0 }) list_cur = list(cursor) yaml_data = yaml.dump(list_cur, explicit_start = True, explicit_end = False, sort_keys=False, indent=3) with open('data.yaml', 'w') as file: file.write(yaml_data)
生成的YAML包含多余的-和{},导致网络自动化脚本报错:
--- - inventory: plugin: SimpleInventory options: host_file: /home/rojin/virtualP/ProjectAutomation/inventory/hosts.yaml group_file: /home/rojin/virtualP/ProjectAutomation/inventory/groups.yaml runner: plugin: threaded options: num_workers: '1' - {}
需要生成的规范YAML格式:
--- inventory: plugin: SimpleInventory options: host_file: "/home/rojin/virtualP/ProjectAutomation/inventory/hosts.yaml" group_file: "/home/rojin/virtualP/ProjectAutomation/inventory/groups.yaml" #defaults_file: "/home/rojin/virtualP/ProjectAutomation/inventory/defaults.yaml" runner: plugin: threaded options: num_workers: 1
问题原因
- 原代码将查询结果转为列表
list_cur = list(cursor),yaml.dump会把列表序列化为YAML的列表结构(带-前缀); - 若MongoDB中存在空文档,会生成
- {}的无效条目; - 标准库
yaml对引号、缩进的控制不如ruamel.yaml灵活,无法满足配置文件的格式要求。
解决代码
改用find_one获取单个文档(假设MongoDB中仅存一份配置数据),并用ruamel.yaml生成规范YAML:
from pymongo import MongoClient import ruamel.yaml # 连接MongoDB client = MongoClient("localhost", 27017) db = client["movie_db"] collection = db.movies # 获取目标配置文档(排除_id字段) config_doc = collection.find_one({}, {"_id": 0}) # 初始化ruamel.yaml配置 yaml = ruamel.yaml.YAML() yaml.explicit_start = True # 保留---开头 yaml.indent(mapping=3, sequence=3, offset=2) # 控制缩进格式 yaml.preserve_quotes = True # 保留字符串引号 # 写入YAML文件 with open('data.yaml', 'w') as f: yaml.dump(config_doc, f)
效果说明
生成的YAML会是顶层字典结构,无多余的-和{},同时可通过ruamel.yaml的参数配置缩进、引号等格式,完全匹配网络自动化脚本的配置要求。
内容的提问来源于stack exchange,提问作者Super MaxLv4
相关产品推荐
相关产品推荐

