【问题标题】:python yaml load_all fetching wrong Keyspython yaml load_all 获取错误的密钥
【发布时间】:2020-05-30 01:16:01
【问题描述】:

yaml.load 在“:”之后都需要空格来识别正确的键。如果它没有找到空间,它将使用整个键值对作为键,然后将 None 作为值。

见下文:OP print has 'B2_key:B2_VAL': None

test_item = "A1: {B1_key: b1_val, B2_key:B2_VAL}"
yaml_iterator = yaml.load_all(test_item, Loader=yaml.Loader)
op = {}
for item in yaml_iterator:
    op.update(item)
print(op)

Output print: {'A1': {'B1_key': 'b1_val', 'B2_key:B2_VAL': None}}

我知道我们只能拥有正确格式的 IP 文件。但是我们有办法处理它吗?我希望用户不关心空间。

一种方法是检查 OP 字典并在那里处理它。

请建议处理此问题的最佳方法。提前致谢。

【问题讨论】:

  • 我希望用户不要关心空格。然后选择基于缩进的格式是一个非常糟糕的主意。正如您在对答案的评论中所说的那样,如果您放弃以下空格要求,您将无法知道用户是否打算将 : 用作值分隔符或内容的一部分。这正是 YAML 需要空间的原因。如果你知道自己无法区分,你期待什么样的答案?

标签: python yaml pyyaml


【解决方案1】:

YAML syntax 明确指出冒号后面必须跟一个空格。因此,您有两种选择:

  1. 要求您的用户使用 YAML 编写(即使这意味着他们在指定键时必须在冒号后添加一个空格);或者,
  2. 使用与 YAML 有点相似的半深思熟虑的格式,您尚未为其构建解析器,并且不允许其中包含冒号的键。

选择选项 1

【讨论】:

    【解决方案2】:

    如果您真的不希望您的用户关心语法并且您在字符串中包含 yaml,您可以在分号后添加空格:

    test_item = test_item.replace(':', ': ')
    

    输出:

    {'A1': {'B1_key': 'b1_val', 'B2_key': 'B2_VAL'}}
    

    但这只有在键和值中不允许使用分号时才有效。

    【讨论】:

    • 这很好。但是某些值可能是一个字符串,其中可能包含:并且我可能会篡改它:(
    • 在这种情况下,我想您将不得不为您的特定需求构建一个自定义解析器,正如 Amitai 在他的回答中提到的那样。
    猜你喜欢
    • 2017-10-01
    • 2013-08-04
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多