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

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

问题原因

  1. 原代码将查询结果转为列表list_cur = list(cursor),yaml.dump会把列表序列化为YAML的列表结构(带-前缀);
  2. 若MongoDB中存在空文档,会生成- {}的无效条目;
  3. 标准库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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:55:21