gpt4 book ai didi

python-3.x - 包含 "- "的字符串总是使用 ruamel.yaml 换行

转载 作者:行者123 更新时间:2023-12-02 03:32:06 36 4
gpt4 key购买 nike

我对 Python 3.7 项目中的 YAML 相当陌生,并决定使用 ruamel.yaml 来开始。我打算用它来存储与某些视频文件相关的元数据。

我正在使用以下代码创建 YAML 文件:

data[filename] = [{'video': video_path},
{'key_frame': frame_path},
{'processed': get_timestamp()}]
yaml.dump(data, file_handle)

创建的 YAML 文件如下所示:

video.mp4:
- video: /Users/xyz/video.mp4
- key_frame: /Users/xyz/imgOutput/frame
- Trigger.jpg
- processed: '2018-07-26 17:09:06'

问题在于 key_frame 是一个名为“frame - Trigger.jpg”的文件。但是,该行始终在文件名中的“-”(即空格-破折号-空格)处断开。结果作为人类可读的文件,看起来非常错误。事实上,当它被读回(使用 yaml.open)时,它会被正确处理,并被视为应有的单个字符串文件名。只是 YAML 文件中的格式错误。

对原因有什么想法吗?这是预期的行为吗?我尝试了许多不同的方式来引用字符串,以防万一(这没有什么区别 - 即使引用它也会在行上分开),但从根本上来说,从代码意义上来说它确实有效 - 但作为 YAML 的大卖点重点是人类可读的文件,最好了解导致它的原因以及如何修复它。

最佳答案

在 YAML 中,普通标量(即没有单引号或双引号的标量)可以包裹到空格上的缩进换行符。这就是正在发生的事情。

重现这一点很困难,因为您的问题相当不完整,但从输出中可以很容易地看出一些事情:

  • datadict
  • filename , video_path ,和frame_path被定义为字符串。
  • file_handle可能是一些打开用于写入的文件流。

其他的则不太容易推断:

  • get_timestamp()不返回 datetime.datetime()正如人们从其名称中所期望的那样,它是一个字符串表示形式。为了防止该字符串被解释为时间戳,必须将其加引号。
  • 您正在使用默认值 YAML()实例(等于 typ='rt' ),因为非默认实例将以流样式编写叶映射( - {video: /Users/xyz/video.mp4} 等)

有了这个和适当的 import你可以制作一个正常运行的程序:

import datetime
import sys
import ruamel.yaml

yaml = ruamel.yaml.YAML(typ='rt')

def get_timestamp():
return datetime.datetime(2018, 7, 26, 17, 9, 6).isoformat(sep=' ', timespec='seconds')

data = {}
filename = 'video.mp4'
video_path = '/Users/xyz/video.mp4'
frame_path = '/Users/xyz/imgOutput/frame - Trigger.jpg'
file_handle = sys.stdout

data[filename] = [{'video': video_path},
{'key_frame': frame_path},
{'processed': get_timestamp()}]
yaml.dump(data, file_handle)

输出:

video.mp4:
- video: /Users/xyz/video.mp4
- key_frame: /Users/xyz/imgOutput/frame - Trigger.jpg
- processed: '2018-07-26 17:09:06'

所以我们忘记了一件事,那就是:

yaml.width = 24  # range from 24-38 inclusive

这样你就得到了输出:

video.mp4:
- video: /Users/xyz/video.mp4
- key_frame: /Users/xyz/imgOutput/frame
- Trigger.jpg
- processed: '2018-07-26 17:09:06'

所以只需删除 yaml.width =线,您应该已准备就绪。


下次请提供一个最小但完整的、能实际产生输出的功能程序。

我的猜测是您的frame_path比您在此处显示的要长得多,并且您没有用户xyz 。这会导致您超过默认宽度(在发射器中定义为 80 )和要换行的普通标量。刚刚设置yaml.width = 4096或者您的标量长度和嵌套深度所需的任何内容。

当怀疑 YAML 输出是否正确时,将其读回(使用 YAML(typ='safe').load(input_stream) ,它应该生成原始数据。

关于python-3.x - 包含 "- "的字符串总是使用 ruamel.yaml 换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51543426/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com