【问题标题】:Issue in writing a list to a YML file将列表写入 YML 文件的问题
【发布时间】:2022-01-12 13:53:22
【问题描述】:
import yaml

output = [
    '{"football": "basketball"}',
    '{"basketball": "basketball" }'
]

dict_file = [
    {'sports' : output},
    {'countries' : [
        'Pakistan',
        'USA',
        'India',
        'China',
        'Germany',
        'France',
        'Spain']
    }
]

with open(r'E:\data\store_file.yaml', 'w') as file:
    documents = yaml.dump(dict_file, file)

输出:

- sports:
  - '{"football": "basketball"}'
  - '{"basketball": "basketball" }'

期望的输出:

- sports:
  - {"football": "basketball"}
  - {"basketball": "basketball" }

请帮帮我。

【问题讨论】:

    标签: python python-3.x list yaml pyml


    【解决方案1】:

    YAML 文件准确地代表了您在问题中显示的数据。变量output 是字符串列表,而不是字典列表。对于所需的输出,您需要修复您的代码:

    output = [{"football": "basketball"}, {"basketball": "basketball" }]
    

    请注意,这将为您提供:

    - sports:
      - football: basketball
      - basketball: basketball
    

    语法上等同于:

    - sports:
      - {"football": "basketball"}
      - {"basketball": "basketball" }
    

    【讨论】:

      【解决方案2】:

      您将字符串存储在output

      删除单引号使其成为字典:

      output = [{"football": "basketball"}, {"basketball": "basketball" }]
      

      【讨论】:

      • 感谢您的回复。如果我有如下输出怎么办? output = ['我更喜欢 [football]{"xyz": "sports", "val": "health"} 而不是篮球']
      【解决方案3】:

      最终,这对你有用

      import yaml
      import json
      output = ['{"football": "basketball"}', '{"basketball": "basketball" }']
      dict_file = [{'sports' : [json.loads(_) for _ in output]},
      {'countries' : ['Pakistan', 'USA', 'India', 'China', 'Germany', 'France', 'Spain']}]
      
      with open(r'E:\data\store_file.yaml', 'w') as file:
          documents = yaml.dump(dict_file, file)
      

      .yml文件:

      
          - sports:
            - football: basketball
            - basketball: basketball
          - countries:
            - Pakistan
            - USA
            - India
            - China
            - Germany
            - France
            - Spain
      
      

      供您参考,dict 结构在.yml 中不会带有{} 括号。它将不带括号,阅读时您可以阅读为键和值(Dict)类型。

      注意:更新了答案并感谢您提出@accdias

      【讨论】:

      • 我猜json.loads() 不是eval(),而是一个更安全的选择。像这样的东西可以完成这项工作:{'sports': [json.loads(_) for _ in output]}.
      • @accdias,你是 100% 正确的。
      • @accdias 我已经用你的建议更新了答案,是的,这是最安全的实施方法。
      • 不错。不过,您的答案中缺少import json。 :-)
      • 感谢您指出。我也加了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多