【问题标题】:Append to YAML list - how do I only 'append' the value?附加到 YAML 列表 - 我如何只“附加”值?
【发布时间】:2019-08-21 17:58:25
【问题描述】:

过去一个小时我一直在谷歌上搜索,但还没有找到解决方案。我正在尝试生成一个应具有以下格式的.yaml 文件:

"objects":
   -"dog"
   -"cat"
   -"rabbit"

文件最初是空的(只有objects 应该在那里)并且应该附加名称。这是它最初的样子:

"objects":

试图追加到一个空列表给我以下错误:

Traceback (most recent call last):
  File "C:\others\py_projects\learn\controller\addNewItemController.py", line 67, in onSave
    cur_yaml["objects"].append(self._model.myObjectName)
AttributeError: 'NoneType' object has no attribute 'append'

我的代码如下:

objectNameDict = [self._model.myObjectName]
        with open('files/object.yaml', 'r') as yamlfile:
            cur_yaml = yaml.safe_load(yamlfile)
            cur_yaml = {} if cur_yaml is None else cur_yaml
            cur_yaml["objects"].append(objectNameDict)
            print(cur_yaml)

        with open('files/object.yaml', 'w') as yamlfile:
            yaml.safe_dump(cur_yaml, yamlfile, explicit_start=True, allow_unicode=True, encoding='utf-8')

解决了列表问题(感谢 lasrks),但第一次尝试总是失败,因为列表为空。

我该怎么办?

【问题讨论】:

    标签: python yaml pyyaml


    【解决方案1】:

    问题是您正在尝试将append 一个列表添加到另一个列表。暂时忘掉 YAML,想想 Python。如果我从一个列表开始......

    >>> mylist = ['thing1']
    

    ...然后尝试给它append一个列表,我最终得到一个嵌套列表:

    >>> mylist.append(['another', 'list'])
    >>> mylist
    ['thing1', ['another', 'list']]
    

    这正是您在问题中看到的。如果要将名称不佳的 objectNameDict 中的项目添加到现有列表中,则需要 extend 方法:

    >>> mylist = ['thing1']
    >>> mylist.extend(['another', 'list'])
    >>> mylist
    ['thing1', 'another', 'list']
    

    当您读取初始 YAML 文件时,其中 objects 键存在但为空:

    ---
    objects:
    

    您最终会得到如下所示的数据结构:

    >>> import yaml
    >>> with open('file.yml') as yamlfile:
    ...   cur_yaml = yaml.safe_load(yamlfile)
    ...
    >>> cur_yaml
    {'objects': None}
    >>>
    

    为了将其转换为列表,您需要执行以下操作:

    >>> if cur_yaml['objects'] is None:
    ...   cur_yaml['objects'] = []
    

    【讨论】:

    • 是的,刚才想通了。目前,问题在于“最初为空”列表。这在至少有一个值时有效,但我不能拥有它。这实际上是对我正在重命名的文件夹的引用,在重命名任何内容之前,此列表应该为空。如何使其与“空优先”列表一起使用?
    • 当列表为“空”时,YAML 文件究竟是什么样的?它是否有objects 键?如果有,价值是多少? (最好使用此信息更新您的问题,您可以在其中正确格式化,而不是将其作为评论留下。)
    • 用回溯编辑了问题。是的,“对象”键存在。
    • 我已经更新了答案。希望这会为您指明正确的方向。
    • 它有效!太感谢了。我不明白为什么它变成了 Nonetype 所以谢谢你的解释!
    猜你喜欢
    • 2021-11-05
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 2011-10-14
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多