附加到YAML列表-如何仅“附加”值?

时间:2019-08-21 17:58:25

标签: python yaml pyyaml

我已经搜索了大约一个小时,还没有找到解决方案。我正在尝试生成一个.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')

解决了列表问题(由于使用了傻瓜),但是第一次尝试始终会失败,因为列表为空。

我该怎么办?

1 个答案:

答案 0 :(得分: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'] = []