解析 YAML,即使在有序映射中也能获取行号

2023-11-29

我需要获取 YAML 文件中某些键的行号。

请注意,这个答案没有解决问题:我确实使用鲁梅尔.yaml,并且答案不适用于有序地图。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from ruamel import yaml

data = yaml.round_trip_load("""
key1: !!omap
  - key2: item2
  - key3: item3
  - key4: !!omap
    - key5: item5
    - key6: item6
""")

print(data)

结果我得到这个:

CommentedMap([('key1', CommentedOrderedMap([('key2', 'item2'), ('key3', 'item3'), ('key4', CommentedOrderedMap([('key5', 'item5'), ('key6', 'item6')]))]))])

什么不允许访问行号,除了!!omap keys:

print(data['key1'].lc.line)  # output: 1
print(data['key1']['key4'].lc.line)  # output: 4

but:

print(data['key1']['key2'].lc.line)  # output: AttributeError: 'str' object has no attribute 'lc'

Indeed, data['key1']['key2] is a str.

我找到了一个解决方法:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from ruamel import yaml

DATA = yaml.round_trip_load("""
key1: !!omap
  - key2: item2
  - key3: item3
  - key4: !!omap
    - key5: item5
    - key6: item6
""")


def get_line_nb(data):
    if isinstance(data, dict):
        offset = data.lc.line
        for i, key in enumerate(data):
            if isinstance(data[key], dict):
                get_line_nb(data[key])
            else:
                print('{}|{} found in line {}\n'
                      .format(key, data[key], offset + i + 1))


get_line_nb(DATA)

output:

key2|item2 found in line 2

key3|item3 found in line 3

key5|item5 found in line 5

key6|item6 found in line 6

但这看起来有点“脏”。有更合适的方法吗?

编辑:这种解决方法不仅脏,而且只适用于像上面这样的简单情况,并且一旦存在嵌套列表就会给出错误的结果


这个问题不是你使用的!omap并且它不会像“正常”映射那样为您提供行号。从你从做得到 4 的事实中应该可以清楚地看出这一点print(data['key1']['key4'].lc.line) (where key4是一把钥匙在外面!omap).

As this答案表明,

您可以访问收藏品的财产信用证

的价值data['key1']['key4']是一个收藏品(另一个!omap),但值data['key1']['key2']不是一个集合项,而是一个内置的 python 字符串,它没有槽来存储lc属性。

为了得到一个.lc非集合上的属性(例如字符串)您必须对其进行子类化RoundTripConstructor,使用类似中的类scalarstring.py (with __slots__调整以接受lc属性,然后将节点中可用的行信息传递给该属性,然后设置行、列信息:

import sys
import ruamel.yaml

yaml_str = """
key1: !!omap
  - key2: item2
  - key3: item3
  - key4: !!omap
    - key5: 'item5'
    - key6: |
        item6
"""

class Str(ruamel.yaml.scalarstring.ScalarString):
    __slots__ = ('lc')

    style = ""

    def __new__(cls, value):
        return ruamel.yaml.scalarstring.ScalarString.__new__(cls, value)

class MyPreservedScalarString(ruamel.yaml.scalarstring.PreservedScalarString):
    __slots__ = ('lc')

class MyDoubleQuotedScalarString(ruamel.yaml.scalarstring.DoubleQuotedScalarString):
    __slots__ = ('lc')

class MySingleQuotedScalarString(ruamel.yaml.scalarstring.SingleQuotedScalarString):
    __slots__ = ('lc')

class MyConstructor(ruamel.yaml.constructor.RoundTripConstructor):
    def construct_scalar(self, node):
        # type: (Any) -> Any
        if not isinstance(node, ruamel.yaml.nodes.ScalarNode):
            raise ruamel.yaml.constructor.ConstructorError(
                None, None,
                "expected a scalar node, but found %s" % node.id,
                node.start_mark)

        if node.style == '|' and isinstance(node.value, ruamel.yaml.compat.text_type):
            ret_val = MyPreservedScalarString(node.value)
        elif bool(self._preserve_quotes) and isinstance(node.value, ruamel.yaml.compat.text_type):
            if node.style == "'":
                ret_val = MySingleQuotedScalarString(node.value)
            elif node.style == '"':
                ret_val = MyDoubleQuotedScalarString(node.value)
            else:
                ret_val = Str(node.value)
        else:
            ret_val = Str(node.value)
        ret_val.lc = ruamel.yaml.comments.LineCol()
        ret_val.lc.line = node.start_mark.line
        ret_val.lc.col = node.start_mark.column
        return ret_val


yaml = ruamel.yaml.YAML()
yaml.Constructor = MyConstructor

data = yaml.load(yaml_str)
print(data['key1']['key4'].lc.line)
print(data['key1']['key2'].lc.line)
print(data['key1']['key4']['key6'].lc.line)

请注意最后一次调用的输出print是 6,因为文字标量字符串以|.

如果你也想转储data,你需要做一个Representer意识到那些My.... types.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解析 YAML,即使在有序映射中也能获取行号 的相关文章

  • 如何使用我自己的自定义表单覆盖 django-rest-auth 中的表单?

    我正在使用 django rest auth 并尝试通过覆盖表单的方法之一来修复密码重置视图中的错误 尽管我已经使用不同的 django rest auth 表单成功完成了类似的操作 但我无法让它在这个表单上工作 无论我做什么 都会使用旧的
  • 如何在seaborn热图标签中使用科学计数法?

    我正在尝试在 python 中使用seaborn 获取热图 不幸的是 即使数字非常大 它也没有使用科学记数法 我想知道是否有任何简单的方法可以转换为科学记数法或任何其他合理的格式 这是显示问题的一段代码 import seaborn as
  • 烧瓶 - 404 未找到

    我是烧瓶开发的新手 这是我在烧瓶中的第一个程序 但它向我显示了这个错误 在服务器上找不到请求的 URL 如果您输入了网址 请手动检查拼写并重试 这是我的代码 from flask import Flask app Flask name ap
  • 获取 int() 参数必须是字符串或数字,而不是“Column”- Apache Spark

    如果我使用以下代码 我会收到此异常 int argument must be a string or a number not Column df df withColumn FY F when df ID substr 5 2 isin
  • Karasuba算法递归过多

    我正在尝试用 c 实现 Karasuba 乘法算法 但现在我只是想让它在 python 中工作 这是我的代码 def mult x y b m if max x y lt b return x y bm pow b m x0 x bm x1
  • dask apply:AttributeError:“DataFrame”对象没有属性“name”

    我有一个参数数据框 并对每一行应用一个函数 该函数本质上是几个 sql queries 和对结果的简单计算 我正在尝试利用 Dask 的多处理 同时保持结构和界面 下面的例子有效并且确实有显着的提升 def get metrics row
  • Django Web 应用程序中的 SMTP 问题

    我被要求向使用 Django Python 框架实现的现有程序添加一个功能 此功能将允许用户单击一个按钮 该按钮将显示一个小对话框 表单以输入值 我确实编写了一些代码 显示电子邮件已发送的消息 但实际上 它没有发送 My code from
  • 同一台机器上有多个Python版本?

    Python 网站上是否有关于如何在 Linux 上的同一台计算机上安装和运行多个版本的 Python 的官方文档 我可以找到无数的博客文章和答案 但我想知道是否有 标准 官方方法可以做到这一点 或者这一切都取决于操作系统 我认为它是完全独
  • Bokeh 中单独的节点和边缘悬停工具?

    我正在尝试为 Bokeh 中的节点和边缘获取单独的悬停工具提示 但未能使其正常工作 有人可以指出我做错了什么吗 我相信代码应该如下所示 from bokeh io import show output notebook from bokeh
  • 使用 Windows 任务计划程序安排 [Virtualenv 相关] Python 脚本

    I want to schedule a python script to start at 3AM and break at 5PM every weekday However the problem arises when I need
  • python中将对象数据类型转换为字符串问题

    如何将对象数据类型结构转换为字符串数据类型 下面的方法不起作用 该列仍然存在object转换为字符串后 astype import pandas as pd df pd DataFrame country A B C D E df dtyp
  • 将 Python Selenium 输出写入 Excel

    我编写了一个脚本来从在线网站上抓取产品信息 目标是将这些信息写入 Excel 文件 由于我的Python知识有限 我只知道如何在Powershell中使用Out file导出 但结果是每个产品的信息都打印在不同的行上 我希望每种产品都有一条
  • 无法将matplotlib安装到pycharm

    我最近开始使用Python速成课程学习Python编程 我陷入困境 因为我无法让 matplotlib 在 pycharm 中工作 我已经安装了pip 我已经通过命令提示符使用 pip 安装了 matplotlib 现在 当我打开 pych
  • RuntimeError(f"目录 '{directory}' 不存在") RuntimeError: 目录 'app/static' 不存在

    当我运行 server py 文件时出现错误 File C Users nawin AppData Local Programs Python Python38 lib site packages starlette staticfiles
  • 使用 Sphinx 时,如何记录没有文档字符串的成员?

    我正在为我发布的包编写文档 我发现您的文档越全面 人们就越容易找到您的包来使用 废话 实际上 我在充满爱心地编写代码的所有功能和细节方面获得了很多乐趣 然而 我对如何为类级变量编写与 Sphinx 兼容的文档感到完全困惑 特别是 我有一些e
  • 使用 Numpy 进行多维批量图像卷积

    在图像处理和分类网络中 一个常见的任务是输入图像与一些固定滤波器的卷积或互相关 例如 在卷积神经网络 CNN 中 这是一种极其常见的操作 我已将通用版本任务减少为 Given 一批 N 个图像 N H W D 和一组 K 个滤镜 K H W
  • 如何在supervisord中设置组?

    因此 我正在设置 Supervisord 并尝试控制多个进程 并且一切正常 现在我想设置一个组 以便我可以启动 停止不同的进程集 而不是全部或全无 这是我的配置文件的片段 group tapjoy programs tapjoy game1
  • 在 python 中使用高精度时间戳

    嘿 我正在使用 python 处理日期时间 我想知道解析这个时间戳的最佳方法是什么 时间戳是ISO标准 这里是一个例子 2010 06 19T08 17 14 078685237Z 现在到目前为止我已经使用过 time datetime d
  • python 日志记录替代方案 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 蟒蛇记录模块 http docs python org library logging html使用起来
  • 正则表达式 - 匹配不包含字符串的模式

    我对正则表达式很陌生 并且一直在寻找方法来做到这一点 但没有成功 给定一个字符串 我想删除以 abc 开头 以 abc 结尾且中间不包含 abc 的任何模式 如果我做 abc abc abc 它将匹配以 b 开头 以 abc 结尾并且中间包

随机推荐

  • jQuery 日期选择器动态设置所选日期

    如何动态更改 jquery 日期选择器的选定日期 我说过创建了一个内联日期选择器 然后过了一段时间 我想在那里反映不同的日期 而无需从头开始重新创建日期选择器 我尝试了setDate方法 但没有用 并且文档中没有太多文档doc 还有另一个
  • Flask 会话不会在 heroku 上持久存在

    当用户登录到我的示例应用程序时 我将用户名密钥添加到会话对象中 并将用户对象挂在全局 g 对象之外 见下文 app route login methods GET POST def login Logs the user in error
  • 逃避大括号的简单方法?

    有没有一种简单的方法可以用 Handlebars 构建字符串 value 也许类似于 Handlebars compile var var value 车把支持空白 特点 以下应该有效 Handlebars compile var var
  • 在 Grails 中,如何指定 ivy 解析器所需的 jar?

    在 grails 项目中 我根据参考文档添加了一个自定义 ivy 解析器 http www grails org doc latest guide single html 12 2 20 插件 20 存储库 然而 这个解析器需要 jsch
  • Swift 中的 HTTP 请求与 swift3 中的 POST 方法

    我正在尝试在 Swift3 中运行 HTTP 请求 将 2 个参数 POST 到 URL Example Link http test tranzporthub com street45 customer login php Params
  • JavaFX - BorderPane/StackPane 在子项更改后未调整大小

    从 JavaFX BorderPane 添加和删除内容时 我遇到调整大小问题 在手动调整窗口大小之前 不会调整 BorderPane 内容的大小 我编写了一个小型测试应用程序来模拟这种行为 该应用程序构建了一个 BorderPane 其中包
  • 无法将Redis服务器连接到nodejs,Docker compose

    我正在努力将 Redis 部署连接到我的 Nodejs 应用程序 当然 在本地不使用 docker 它工作得很好 所以我对这是否与我的代码有关 或者我设置 docker compose 文件的方式有争议 Dockerfile FROM no
  • 日期时间(微秒)

    微秒的日期时间值是否会以精确的精度转换为双精度 例如 我的日期是2017 年 7 月 3 日 10 00 00 00 刻度 636346728000000050 正如我所得到的那样 它转换为双倍42919 4166666667 同样 我已将
  • 如何获得 Spinner 的选定值?

    我正在尝试从 a 中获取选定的项目字符串Spinner 到目前为止我已经得到了这个 bundle putString ListDbAdapter DB PRI v getText toString 这不起作用并给出一个类转换异常 我想我可以
  • 在 xcode/ios 中以编程方式编辑 RTF/DOC 文件

    我有一个可以在 iPhone 上查看的 RTF 文件 现在我需要以编程方式编辑该文件 请告诉我该怎么做 例子 RTF文件内容 我是 StackOverflow 的新手 现在我需要以编程方式更改为以下行 我经常访问 StackOverflow
  • 在 Linux 中查找包的二进制文件

    我正在完成一个包 但是我似乎没有找到一种方法使包在系统中找到二进制文件 请注意下面的代码 find nim lt function message TRUE nimexe lt if Platform OS type unix nimexe
  • Laravel 中 Count 为零时如何获取记录

    我使用 Chart js 来显示每个月的预订数量 这是我的查询 它运行良好 我的问题是 如果一个月内没有预订 那么它不会显示任何内容 没有零值 在图表上我得到的值如下 1月23日 2月34日 4月23日 May 25 July 42 图表上
  • Pyspark 中的 JSON 文件解析

    我对 Pyspark 很陌生 我尝试使用以下代码解析 JSON 文件 from pyspark sql import SQLContext sqlContext SQLContext sc df sqlContext read json f
  • 网站图标在 IE 中不工作

    我有一个使用自定义 favicon ico 的网站 图标在除 IE 之外的所有浏览器中按预期显示 当尝试在 IE 中显示图标时 我得到大红色 x 当在另一个浏览器中显示图标时 它显示得很好 页面源码包括 它确实可以在其他浏览器中工作 谢谢你
  • jQuery + MarkItUp + Polymer - 让它发挥作用吗?

    Using Polymer 我正在尝试创建一个可重用的组件markItUp这样我就可以在需要时使用富文本编辑器 但是 尽我所能 我无法让它正确初始化 jQuery 选择器根本无法找到 textarea 元素来发挥其魔力 我已经尝试了很多添加
  • 子表中的外键约束允许插入父表中不存在的值

    我正在使用 SQL Server 2012 我已经在表上定义了外键约束 外键引用复合主键 当一列具有 00000 而另一列为空时 fk 约束不起作用 父表不包含 00000 两个 fk 列都有varchar数据类型 下面是示例 INSERT
  • 通知消息是否会计入collapse_key 限制?

    根据Firebase 通知文档 通知消息始终是可折叠的 我试图弄清楚他们是否有一些内在的collapse key 如果是这样 这是否算作collapse key每台设备最多 4 个 你是对的 从 Web 控制台发送的所有通知都是可折叠的 这
  • drupal_add_css、drupal_add_js 不起作用

    我在用drupal add css and drupal add js 将 CSS 和 JavaScript 文件添加到我的 Drupal 站点 我在一个名为 control 的模块中执行此操作 因此我正在使用的函数被称为control p
  • 如何从 HTML 中删除多个空白字符?

    我想删除来自用户端的额外空白 但我无法预测 HTML 的格式 例如 p It s interesting that you would try cfsetting since nothing in it s documentation wo
  • 解析 YAML,即使在有序映射中也能获取行号

    我需要获取 YAML 文件中某些键的行号 请注意 这个答案没有解决问题 我确实使用鲁梅尔 yaml 并且答案不适用于有序地图 usr bin env python3 coding utf 8 from ruamel import yaml