附加到 YAML 列表 - 我如何只 'append' 值?
Append to YAML list - how do I only 'append' the value?
我在谷歌上搜索了大约一个小时,但还没有找到解决方案。我正在尝试生成一个 .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),但第一次尝试总是失败,因为列表是空的。
我该怎么办?
问题是您正试图将一个列表 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":
-"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),但第一次尝试总是失败,因为列表是空的。
我该怎么办?
问题是您正试图将一个列表 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'] = []