如何解析包含多个文档的 YAML 文件?

2024-01-14

这是我的解析代码:

import yaml

def yaml_as_python(val):
    """Convert YAML to dict"""
    try:
        return yaml.load_all(val)
    except yaml.YAMLError as exc:
        return exc

with open('circuits-small.yaml','r') as input_file:
    results = yaml_as_python(input_file)
    print results
    for value in results:
         print value

以下是该文件的示例:

ingests:
  - timestamp: 1970-01-01T00:00:00.000Z
    id: SwitchBank_35496721
    attrs:
      Feeder: Line_928
      Switch.normalOpen: 'true'
      IdentifiedObject.description: SwitchBank
      IdentifiedObject.mRID: SwitchBank_35496721
      PowerSystemResource.circuit: '928'
      IdentifiedObject.name: SwitchBank_35496721
      IdentifiedObject.aliasName: SwitchBank_35496721
    loc: vector [43.05292, -76.126800000000003, 0.0]
    kind: SwitchBank
  - timestamp: 1970-01-01T00:00:00.000Z
    id: UndergroundDistributionLineSegment_34862802
    attrs:
      Feeder: Line_928
      status: de-energized
      IdentifiedObject.description: UndergroundDistributionLineSegment
      IdentifiedObject.mRID: UndergroundDistributionLineSegment_34862802
      PowerSystemResource.circuit: '928'
      IdentifiedObject.name: UndergroundDistributionLineSegment_34862802
    path:
    - vector [43.052942000000002, -76.126716000000002, 0.0]
    - vector [43.052585000000001, -76.126515999999995, 0.0]
    kind: UndergroundDistributionLineSegment
  - timestamp: 1970-01-01T00:00:00.000Z
    id: UndergroundDistributionLineSegment_34806014
    attrs:
      Feeder: Line_928
      status: de-energized
      IdentifiedObject.description: UndergroundDistributionLineSegment
      IdentifiedObject.mRID: UndergroundDistributionLineSegment_34806014
      PowerSystemResource.circuit: '928'
      IdentifiedObject.name: UndergroundDistributionLineSegment_34806014
    path:
    - vector [43.05292, -76.126800000000003, 0.0]
    - vector [43.052928999999999, -76.126766000000003, 0.0]
    - vector [43.052942000000002, -76.126716000000002, 0.0]
    kind: UndergroundDistributionLineSegment
... 
ingests:
  - timestamp: 1970-01-01T00:00:00.000Z
    id: OverheadDistributionLineSegment_31168454

在回溯中,请注意它开始出现问题......

Traceback (most recent call last):
  File "convert.py", line 29, in <module>
    for value in results:
  File "/Users/conduce-laptop/anaconda2/lib/python2.7/site-packages/yaml/__init__.py", line 82, in load_all
    while loader.check_data():
  File "/Users/conduce-laptop/anaconda2/lib/python2.7/site-packages/yaml/constructor.py", line 28, in check_data
    return self.check_node()
  File "/Users/conduce-laptop/anaconda2/lib/python2.7/site-packages/yaml/composer.py", line 18, in check_node
    if self.check_event(StreamStartEvent):
  File "/Users/conduce-laptop/anaconda2/lib/python2.7/site-packages/yaml/parser.py", line 98, in check_event
    self.current_event = self.state()
  File "/Users/conduce-laptop/anaconda2/lib/python2.7/site-packages/yaml/parser.py", line 174, in parse_document_start
    self.peek_token().start_mark)
yaml.parser.ParserError: expected '<document start>', but found '<block mapping start>'
  in "circuits-small.yaml", line 42, column 1

我希望它将每个文档解析为一个单独的对象,也许它们都在同一个列表中,或者几乎任何其他可以与 PyYAML 模块一起使用的东西。我相信...实际上是有效的 YAML,所以我很惊讶它不会自动处理它。


错误消息非常具体,文档需要以文档开始标记 http://www.yaml.org/spec/current.html#document%20boundary%20marker/。您的第一个文档没有这样的标记,尽管它有一个文档结束标记。在您明确结束第一个文档后...你不能再在 PyYAML 中使用没有文档边界标记的文档,你必须明确地以---:

文件的末尾应如下所示:

    kind: UndergroundDistributionLineSegment
...
---
ingests:
  - timestamp: 1970-01-01T00:00:00.000Z
    id: OverheadDistributionLineSegment_31168454

您可以省略第一个文档中的显式文档开始标记,但需要为每个后续文档包含一个开始标记。文档结束标记是可选的。

如果您无法完全控制输入,请使用.load_all()不安全。通常没有理由冒这个风险,你应该使用.safe_load_all()并延长SafeLoader处理您的 YAML 可能包含的任何特定标签。

除此之外,您应该以明确的方式开始您的 YAML 文档版本指令 http://www.yaml.org/spec/current.html#id2510119在文档开始指示符之前(您还应该将其添加到第一个文档中):

%YAML 1.1
---

这有利于 YAML 文件的未来编辑者,因为您使用的是 PyYAML,它仅支持(大部分)YAML 1.1,而不支持 YAML 1.2 规范(2009 年格式)。当然,另一种选择是将 YAML 解析器升级为例如鲁梅尔.yaml https://pypi.python.org/pypi/ruamel.yaml/,这也会警告您有关使用不安全的load_all()(免责声明:我是该解析器的作者)。ruamel.yaml不允许你在明确的文档结束标记之后有一个裸文档(正如@flyx指出的那样是允许的),这是一个bug https://bitbucket.org/ruamel/yaml/issues/103/allow-bare-document-after-explicit.

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

如何解析包含多个文档的 YAML 文件? 的相关文章

  • 在 python 的 Visual Studio 工具中按下 ctrl+F5 后,控制台窗口立即关闭

    我已经安装了 Visual Studio 的 Python 工具 但在控制台窗口中看不到输出 就像我在 Visual Studio 中运行 C 控制台应用程序时按以下快捷键时看到的输出一样 F5 开始调试程序并关闭 C 和 Python 中
  • 根据 pandas 中的条件交换列值

    我想按条件重新定位列 如果国家 地区是 日本 我需要将姓氏和名字反向重新定位 df pd DataFrame France Kylian Mbappe Japan Hiroyuki Tajima Japan Shiji Kagawa Eng
  • 对打开文件的脚本进行单元测试

    我编写了一个脚本 它打开一个文件 读取内容并进行一些操作和计算 并将它们存储在集合和字典中 我该如何为这样的事情编写单元测试 我的问题具体是 我会测试文件是否打开 文件很大 这是unix字典文件 我如何对计算进行单元测试 我真的必须手动计算
  • 如何在“python setup.py test”中运行 py.test 和 linter

    我有一个项目setup py文件 我用pytest作为测试框架 我还在我的代码上运行各种 linter pep8 pylint pydocstyle pyflakes ETC 我用tox在多个 Python 版本中运行它们 并使用以下命令构
  • 将 Django 表单中的所有 CharField 表单字段输入转换为小写

    我使用 Django 表单进行用户注册 用户可以在其中输入优惠券代码 我希望在优惠券代码字段中输入的所有字符都转换为小写 我尝试过在保存方法 自定义清理方法和自定义验证器中使用 lower 但这些方法没有运气 下面是我的代码 class S
  • 无法安装时间模块

    我试过了pip install time and sudo H pip install time 但我不断收到错误 找不到满足要求时间的版本 从 版本 未找到时间匹配的发行版 我正在 PyCharm 中工作 但真正没有意义的是我可以在 Py
  • 如何从网站中提取冠状病毒病例?

    我正在尝试从网站中提取冠状病毒 https www trackcorona live https www trackcorona live 但我得到了一个错误 这是我的代码 response requests get https www t
  • 为 PyCharm 中的所有配置设置相同的环境变量

    我有一个与 Celery 和很多不同的工作人员一起的项目 如何避免每次将 PyCharm 中的环境变量复制粘贴到每个运行 调试配置 有什么方法可以在项目设置中设置它们吗 找到解决方案here https stackoverflow com
  • 使用 Python 解析 XML,解析外部 ENTITY 引用

    在我的 S1000D xml 中 它指定了一个带有对公共 URL 的引用的 DOCTYPE 该 URL 包含对包含所有有效字符实体的许多其他文件的引用 我使用 xml etree ElementTree 和 lxml 尝试解析它并得到解析错
  • Docker 日志中的 Python 异常标记为流:stdout

    我想解析和处理来自 docker 容器的所有错误 但当我期望 stderr 时 Python 异常标记为 stdout 举个简单的例子app py raise Exception 然后我在 docker 容器中运行这个文件 但在 var l
  • 将参数传递给 __enter__

    刚刚学习 with 语句尤其是这篇文章 http effbot org zone python with statement htm 问题是 我可以传递一个参数给 enter 我有这样的代码 class clippy runner def
  • 使用 pandas 绘制带有误差线的条形图

    我正在尝试从 DataFrame 生成条形图 如下所示 Pre Post Measure1 0 4 1 9 这些值是我从其他地方计算出来的中值 我还有它们的方差和标准差 以及标准误差 我想将结果绘制为具有适当误差线的条形图 但指定多个误差值
  • dask allocate() 或 apply() 中的变量列名

    我有适用于pandas 但我在将其转换为使用时遇到问题dask 有一个部分解决方案here https stackoverflow com questions 32363114 how do i change rows and column
  • 本地设置的 Cython 编译器指令是否影响一个或所有函数?

    我正在努力使用 Cython 加速一些 Python Numpy 代码 并且对 本地 设置 如定义的here http docs cython org en latest src reference compilation html在文档中
  • Python列表对象属性“append”是只读的

    正如标题所说 在Python中 我试图做到这一点 以便当有人输入一个选择 在本例中为Choice13 时 它会从密码列表中删除旧密码并添加新密码 passwords mrjoebblock mrjoefblock mrjoegblock m
  • scrapy python 请求未定义

    我在这里找到了答案 code for site in sites Link site xpath a href extract CompleteLink urlparse urljoin response url Link yield Re
  • Melt() 函数复制数据集

    我有一个这样的表 id name doggo floofer puppo pupper 1 rowa NaN NaN NaN NaN 2 ray NaN NaN NaN NaN 3 emma NaN NaN NaN pupper 4 sop
  • 字母尺度和随机文本上的马尔可夫链

    我想使用 txt 文件中的一本书中的字母频率生成随机文本 以便每个新字符 string lowercase 取决于前一个 如何使用马尔可夫链来做到这一点 或者使用每个字母都有条件频率的 27 个数组更简单 我想使用来自的字母频率生成随机文本
  • 将数组从 .npy 文件读入 Fortran 90

    我使用 Python 以二维数组 例如 X 的形式生成一些初始数据 然后使用 Fortran 对它们进行一些计算 最初 当数组大小约为 10 000 x 10 000 时 np savetxt 在速度方面表现良好 但是一旦我开始增加数组的维
  • 从 Flask 中的 S3 返回 PDF

    我正在尝试在 Flask 应用程序的浏览器中返回 PDF 我使用 AWS S3 来存储文件 并使用 boto3 作为与 S3 交互的 SDK 到目前为止我的代码是 s3 boto3 resource s3 aws access key id

随机推荐

  • 当文本对齐居中时无法在 Chip 上绘图

    我正在扩展 Chip 类 以便为我的应用程序进行一些绘图lib https github com AbhinavChauhan97 LoaderChip 我的用例更复杂 但为了简单起见 假设我只是画一条对角线 my code class M
  • PrintWriter 自动刷新令人费解的逻辑

    公共 PrintWriter OutputStream 输出 布尔 autoFlush http download oracle com javase 6 docs api java io PrintWriter html PrintWri
  • UIView垂直翻转

    我知道这可能是一个虚拟问题 但我不得不问 如何翻转UIView垂直 我不是要求做动画 只是翻转它 我可以垂直翻转UILabel by label1 layer transform CATransform3DMakeRotation M PI
  • 一个 git 用于不同位置的多个文件夹

    我认为这个主题以前被问过 但我没有发现任何有趣的东西 我读了这个我可以将 git 文件夹存储在我想要跟踪的文件之外吗 https stackoverflow com questions 505467 can i store the git
  • “org.apache.cxf.jaxrs.bus.providers”不工作

    我正在使用 我想保留一些常见的东西 例如 JSON 提供程序 验证拦截器 使用 cxf 总线的异常处理 下面是我的应用程序上下文
  • AppleScript -> 激活不可编写脚本的应用程序的窗口

    我打开了2个 Finder 窗口A和B A在前面 B在下面 以下代码片段将B带到最前面 tell application Finder activate activate window 2 end tell 但对于不支持脚本的应用程序 刚才
  • 谷歌云机器学习错误

    请帮我 我无法解决这个问题 错误 gcloud beta ml models versions create FAILED PRECONDITION 字段 version deployment uri 错误 模型目录 gs valued a
  • PhoneGap 地理定位在 iOS10 中被阻止

    我的 Phonegap 应用程序利用 Cordova 3 8 webviews W3C Geolocation API 然而 自从从 iOS 9 x 升级到 iOS 10 测试版 以来 使用 navigator geolocation ge
  • Laravel 5.7 电子邮件验证抛出 403

    我在我正在开发的 Laravel 5 7 项目中实现了电子邮件验证 我收到了电子邮件 但每当我单击确认按钮甚至电子邮件中提供的 URL 时 都会收到 403 禁止错误 我已经搜索了多种解决方案 但未能找到解决此问题的方法 指向此错误的唯一合
  • 编辑一个单元格时,Swift tableview 会更改随机单元格的值

    我有一个很长的文本字段列表 所以我使用 tableView 这就是屏 幕的样子 https i stack imgur com GqpHN png 当我在其中一个单元格的文本字段中插入一些文本并向下滚动时 其他一些单元格会获得相同的文本字段
  • 将文本/标签添加到 D3 力定向图中的链接上

    我一直在研究修改后的力定向图 并且在将文本 标签添加到链接上时遇到一些问题 其中链接与节点未正确对齐 如何修复它 如何向 SVG 文本元素添加事件侦听器 添加 on dblclick function d 就是不行 这是代码片段
  • 如何动态计算 UILabel 高度[重复]

    这个问题在这里已经有答案了 我有以下代码 label numberOfLines 0 allows label to have as many lines as needed label text some long text label
  • 基于 SSL 的 CFHTTP

    我正在尝试使用 ColdFusion 通过 SSL 从服务器检索文件CFHTTP标记没有成功 我们的环境是使用服务器配置的Linux 使用的密钥库位于cf root runtime jre lib security cacerts 我从目标
  • 如何在Flask中实现基于角色的访问控制?

    是否有任何积极维护的插件可以帮助我创建具有基于角色的访问控制的 Flask 应用程序 例如管理员角色 会计角色 人力资源角色 Flask User看起来不错 但这些讨论表明维护者已经走了 Flask Login needs Flask Se
  • lambda 捕获的生命周期

    给出以下程序 include
  • 找不到分段用户的资源 - 应用程序令牌

    我能够进行身份验证并获取应用程序令牌以使用 Microsoft Graph API 我已设置所有委派和管理权限来访问用户 我还使用图形浏览器来验证我需要什么权限 https developer microsoft com en us gra
  • IIS 7.5 自定义 404 错误页面不适用于 Web 根索引/默认

    我使用 IIS 7 5 创建了一个自定义 404 和 403 14 错误页面 如果未找到静态文件 该页面将显示数据库中的内容 换句话说 如果我浏览到http mysite com test http mysite com test 如果在该
  • 当应用程序运行时,如何在android中以编程方式关闭通知?

    我正在尝试开发一个android我正在其中实现聊天功能的应用程序 但当我收到消息时 它会发出通知声音 用户使用应用程序时如何停止通知以编程方式 private void ChatNotifications String uid String
  • 引导多选搜索从数据库获取值

    我正在使用引导多选 https davidstutz github io bootstrap multiselect 在我的项目中 在搜索中我试图通过以下方式获取数据库值ajax请求 但它没有附加 这是我的代码 example gettin
  • 如何解析包含多个文档的 YAML 文件?

    这是我的解析代码 import yaml def yaml as python val Convert YAML to dict try return yaml load all val except yaml YAMLError as e