【问题标题】:Yaml dump without new line没有新行的 Yaml 转储
【发布时间】:2015-03-25 17:07:28
【问题描述】:

我不确定 Yaml 的规则是否规定必须有新行,但我对 Yaml 序列化字符串中的新行字符有疑问。这是我想要做的:

yaml.dump(my_python_dict)

返回:


"---\nasset_data:\n- {assetDefaultScenePath: 'C:\\\\data\\\\my_newfile.ma',\n  assetName: new_asset}\n- {assetDefaultScenePath: 'C:\\\\assetA.ma',\n  assetName: assetA.ma}\naudio_dir: ''\nbg_dir: ''\ndestination: ''\nepisode: '00'\nprod: test\n"

问题是 YAML 字符串是从 Ruby 生成的,并在到达 Python 之前通过中间脚本语言 (MEL) 传递。中间语言无法理解 Yaml 并计算所有“\n”并失败。我想知道是否有办法在没有换行符的情况下转储 Yaml?我猜这会导致加载问题。我目前没有想法,任何建议都会有所帮助。

这里是有关如何绑定的详细信息。 ruby 代码将构建一个 Windows 命令行并执行它。

"Mayabatch" -command "source \"C:/cygwin/home/workspace/bpt-maya/src/bd_lay/generate.mel\";generate(\"{SERIALIZED_DICT}\")"
  1. SERIALIZED DICT 是需要添加 YAML 数据的地方。
  2. generate.mel 有一个以 SERIALIZED DICT 作为参数的 python 调用
  3. Mayabatch 不支持直接 Python 执行,这就是它需要被包装的原因。 由于双引号,JSON 将在此处失败,这就是我需要其他一些序列化的原因。

【问题讨论】:

  • 尝试修复转储:yaml.dump(my_python_dict).replace('\n', ' ') - 但我猜这会破坏 YAML 语法,所以你真的应该修复 MEL 跨度>
  • MEL 无法处理包含新行的字符串?这听起来像是如何编写 MEL 脚本的问题。但由于需要换行符,您可以在 perl 中对 yaml 进行 base64 编码,然后在 python 中再次对其进行解码。
  • 如果您删除换行符,您的 YAML 将不再解析。您可以考虑在通过您的(损坏的?)环境之前对文档进行编码(base64?)。
  • 我试过 base64 但看起来字符串仍然有换行符。如果梅尔有一些原始字符串的概念,那将不是问题。有没有其他类似于 YAML 的使用单引号的编码?

标签: python yaml


【解决方案1】:

YAML 是 JSON 的超集。因此,有效的 JSON 也是有效的 YAML(但有效的 YAML 不一定是有效的 JSON)。

这一事实可以让人们绕过 MEL 的 YAML 解析限制

>>> import yaml
>>> import json

>>> orig_yaml_txt = "---\nasset_data:\n- {assetDefaultScenePath: 'C:\\\\data\\\\my_newfile.ma',\n  assetName: new_asset}\n- {assetDefaultScenePath: 'C:\\\\assetA.ma',\n  assetName: assetA.ma}\naudio_dir: ''\nbg_dir: ''\ndestination: ''\nepisode: '00'\nprod: test\n"
>>> dict_1 = yaml.load(orig_yaml_txt)
>>> intermediate_json_txt = json.dumps(dict_1)
>>> dict_2 = yaml.load(intermediate_json_txt)
>>> dict_1 == dict_2
True

在上面的 sn-p 中,我将你的 YAML 序列化文本加载到 python 字典中,然后将其转储到 json 序列化文本,然后使用 YAML 将其加载到 python 字典中进行解析。

在您的问题中,您声明原始 YAML 是从 Ruby 生成的。也许,您可以从 Ruby 中转储 JSON,而不是转储 YAML,或者在管道中添加另一个步骤,将 YAML 转换为 JSON,然后再馈送到 MEL。

【讨论】:

  • 这是我的第一次尝试,但传递 JSON 有不同的复杂性。由于数据是通过命令行解析的,因此我需要转义序列才能使用双引号。这就是为什么我需要使用单引号的序列化。我希望这是有道理的。
  • 你是什么意思通过命令行传递,如在管道中?您是否介意用您的数据如何通过命令行传递来更新您的问题。此外,您可以将 json/yaml 写入文件并在程序的下一阶段从文件中读取,而不是“通过命令行传递数据”
  • 编辑了问题。我知道我可以传递一个文件,这就是我所做的:) 但它并不理想。
猜你喜欢
  • 2013-09-02
  • 2019-09-13
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
相关资源
最近更新 更多