当前位置: 首页 > 面试题库 >

是否可以使用PyYAML读取内部带有“ YAML前题”块的文本文件?

洪光霁
2023-03-14
问题内容

抱歉,我对YAML和PyYAML知之甚少,但是我爱上了支持以“
Jekyll”所用相同样式编写的配置文件的想法(http://jekyllrb.com/docs/frontmatter/),AFAIK拥有这些对我来说非常酷和性感的“
YAML Front Matter”块。
因此,我在计算机上安装了PyYAML,并使用以下文本块编写了一个小文件:

---
First Name: John
Second Name: Doe
Born: Yes
---

Lorem ipsum dolor sit amet, consectetur adipiscing elit,  
sed do eiusmod tempor incididunt ut labore et dolore magna  
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco 
laboris nisi ut aliquip ex ea commodo consequat.

然后,我尝试使用以下代码通过Python 3.4和PyYAML读取此文本文件:

import yaml

stream = open("test.yaml")
a = stream.read()
b = yaml.load(a)

但显然它无法正常工作,Python显示此错误消息:

Traceback (most recent call last):
  File "<pyshell#62>", line 1, in <module>
    b = yaml.load(a)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yaml/__init__.py", line 72, in load
    return loader.get_single_data()
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yaml/constructor.py", line 35, in get_single_data
    node = self.get_single_node()
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yaml/composer.py", line 43, in get_single_node
    event.start_mark)
yaml.composer.ComposerError: expected a single document in the stream
  in "<unicode string>", line 2, column 1:
    First Name: John
    ^
but found another document
  in "<unicode string>", line 5, column 1:
    ---
    ^

请问你能帮帮我吗?
我是否以错误的方式编写了代码,或者这意味着PyYAML无法处理YAML前端问题块?
我还可以尝试使用PyYAML做其他事情,还是必须使用regex编写自己的解析器?

非常感谢您的宝贵时间 !


问题答案:

Pythonyaml库不支持读取文档中嵌入的yaml。这是一个提取yaml文本的实用程序函数,因此您可以在读取文件的其余部分之前对其进行解析:

#!/usr/bin/python2.7

import yaml
import sys

def get_yaml(f):
  pointer = f.tell()
  if f.readline() != '---\n':
    f.seek(pointer)
    return ''
  readline = iter(f.readline, '')
  readline = iter(readline.next, '---\n')
  return ''.join(readline)


for filename in sys.argv[1:]:
  with open(filename) as f:
    config = yaml.load(get_yaml(f))
    text = f.read()
    print "TEXT from", filename
    print text
    print "CONFIG from", filename
    print config


 类似资料:
  • 这不是一个浏览器。 我打算为我的机器人做一个“黑名单”数组,这将阻止用户运行命令。然而,我似乎只能在实际的bot文件上这样做,因为我还没有找到一种方法来做一个外部方法。 这就是我正在使用的:

  • 问题内容: 我有一个yaml文件,看起来像这样: 有没有一种方法,我可以和这个数据,同时保持有何评论? 问题答案: PyYAML丢弃了非常低的注释(以中)。 尽管您可以调整或扩展它以处理整个堆栈中的注释,但这将是一个重大修改。发出(=发出)注释似乎更容易,并且在旧的PyYAML错误跟踪器的故障单114中对此进行了讨论。 截至2020年,有关增加对加载评论的支持的功能请求仍处于停滞状态。

  • 本文向大家介绍基于Python和PyYAML读取yaml配置文件数据,包括了基于Python和PyYAML读取yaml配置文件数据的使用技巧和注意事项,需要的朋友参考一下 一、首先我们需要安装 PyYAML 第三方库 直接使用 pip install PyYAML 就可以(这里我之前是装过的,所以提示我PyYAML已经在这个目录下了,是5.1.2版本的) 二、先看一下我的yaml配置文件中数据的格

  • 我的用例有点奇怪,但基本上,我想读取yaml文件的一部分并将其映射到Spring应用程序中适当的java对象。这是Spring中一个非常常见且琐碎的操作(只需使用@ConfigurationProperties)。 然而,在我的情况下,我希望在生命周期的早期完成这一阅读,即在BeanFactoryPostProcessor挂接的时候,以便使用yml中指定的指令动态创建多个bean。 我可以和app

  • 我在图像中有一个边框(矩形的坐标),我想在该坐标内提取文本。如何使用PyteSeract提取该坐标范围内的文本? 我尝试使用opencv将图像部分复制到其他numpyarray,比如 并尝试了pytesseract。图像到字符串()。但准确度很差。但当我试着把原始图像变成pytesseract时。它完美地提取了所有的东西。。 是否有任何功能可以使用pytesseract提取图像的特定部分? 这个图

  • 问题内容: 这是场景: ThreadA将要从某些套接字读取,并将数据写入“ MyFile.txt” ThreadB将读取“ MyFile”,到达末尾时,它将循环播放,直到MyFile中有新数据可用为止(因为我不想重新打开“ MyFile.txt”,并且浪费时间,所以我到达了从我所在的位置..)。 可以做这样的事情吗? 如果没有,还有其他方法可以做这种事情吗? 问题答案: 您提到的问题是著名的生产者

  • 问题内容: 我正在尝试使用Python的ftplib读取文件而不编写它们。大致相当于: 但使用FTP。 我试过了: 但这不起作用。文档中的唯一示例涉及使用该格式编写文件。是否可以在不先写入的情况下读取ftp文件? 问题答案: 好吧,您的答案就在眼前:retrbinary方法接受对函数的引用作为第二个参数,该函数在从ftp连接中检索文件内容时被调用。 这是一个简单的示例: 您应该实现writeFun

  • 问题内容: 我想读取不同块的日志文件,以使其成为多线程。该应用程序将在具有多个硬盘的服务器端环境中运行。读取成块后,应用程序将处理每个块的每一行。 我已经用bufferedreader完成了对每个文件行的读取,并且可以通过将RandomAccessFile与MappedByteBuffer结合使用来制作文件块,但是将这两者结合起来并不容易。 问题在于该块正好切入我块的最后一行。我从来没有块的最后一