当前位置: 首页 > news >正文

Python如何在解析 YAML 文件时保留每个条目的原始行号信息

这样读取yaml文件后,报错信息显示的是item的编号,但是如果想要显示这个item在yaml文件中的原始行号:

with open(yaml_path, 'r', encoding='utf-8') as file:data = yaml.safe_load(file)if not isinstance(data, list):raise ValueError("YAML 数据格式错误:应为条目列表")errors = []
terms_seen = set()for idx, entry in enumerate(data, start=2):# 从2开始,行号计算标题行context = f"Entry {idx} ('{entry.get('Term', 'Unknown')}')"

为了在解析 YAML 文件时保留每个条目的原始行号信息,可以使用 ruamel.yaml 替代 PyYAMLyaml.safe_load 就是它的一部分)。ruamel.yaml 支持保留注释和行号,是专门为这种需求设计的。


✅ 目标:

你希望在处理 entry 时能知道它在原始 YAML 文件中的行号,以便在报错时提示更直观。


🔧 解决方案:

使用 ruamel.yaml 加载并追踪每条数据的行号:

from ruamel.yaml import YAML
from ruamel.yaml.compat import StringIOyaml = YAML()
yaml.preserve_quotes = True  # 可选:保持原始引号with open(yaml_path, 'r', encoding='utf-8') as f:content = f.read()data = yaml.load(content)# 确保数据是列表形式
if not isinstance(data, list):raise ValueError("YAML 数据格式错误:应为条目列表")errors = []
terms_seen = set()for entry in data:# 获取该 entry 的行号(+1,因为 ruamel 使用0-based)line_no = entry.lc.line + 1term = entry.get('Term', 'Unknown')context = f"Line {line_no} ('{term}')"# 示例:检测重复术语if term in terms_seen:errors.append(f"{context} - Term 重复")else:terms_seen.add(term)# 打印错误
for err in errors:print(err)

📌 示例 YAML 内容

- Term: appleDefinition: A fruit
- Term: bananaDefinition: Another fruit
- Term: appleDefinition: Duplicate

输出:

Line 5 ('apple') - Term 重复

📦 安装 ruamel.yaml

如果你未安装 ruamel.yaml,可以通过 pip 安装:

pip install ruamel.yaml
http://www.lqws.cn/news/499285.html

相关文章:

  • Camera Sensor接口协议全解析(四)LVDS与SubLVDS接口及协议深度解析
  • Spring容器启动的关键一步:prepareBeanFactory详解
  • 如何制定团队制度?
  • OpenCV——霍夫变换
  • 首席运营官职责与工作内容概述
  • 秋招Day14 - MySQL - 事务
  • Redis哨兵模式深度解析与实战部署
  • 网页动画与交互性:开发者基础指南
  • 基于springboot+uniapp的“川味游”app的设计与实现7000字论文
  • 如何快速判断Excel文档是否被修改过?Excel多版本比对解决方案
  • 操作系统 第九章 部分
  • 线程池 JMM 内存模型
  • PySide环境配置及工具使用
  • 【题解-Acwing】1022. 宠物小精灵之收服
  • 技术逐梦之旅:从C语言到Vue的成长之路
  • LeetCode中K个链表的链接的解法
  • 108页精品PPT | 大型某著名企业能源行业数字化转型汇报方案能源化工数字化转型
  • AI-Sphere-Butler之如何将豆包桌面版对接到AI全能管家~新玩法(一)
  • Redis基本介绍
  • 词编码模型怎么进行训练的,输出输入是什么,标签是什么
  • leetcode:98. 验证二叉搜索树
  • oracle 表空间与实例妙用,解决业务存储与权限处理难题
  • 企业主动风险管理破局供应链“黑天鹅”,善用期货
  • C# Task 模式实现 Demo(含运行、暂停、结束状态)
  • Redis精简总结|一主二从哨兵模式(工作机制)|集群模式|缓存的穿透雪崩击穿
  • 以计数器程序为例,简析JVM内存模型中各部分的工作方式
  • 72-Oralce Temporay tablespace(单实例和多租户下的管理)
  • 互联网大数据求职面试:从Zookeeper到Flink的技术探讨
  • 华为云Flexus+DeepSeek征文|基于Dify构建抓取金融新闻并发送邮箱工作流
  • 实现 “WebView2 获取word选中内容