如何读取YAML文件中的组件以便可以使用阿默尔·亚姆?

2024-09-29 00:12:54 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的YAML文件(input.yaml):

team_member:
  name: Max
  hobbies:
    - Reading

team_leader:
  name: Stuart
  hobbies:
    - dancing

我想编辑这个YAML文件,在关键的“爱好”中添加更多值,例如:

^{pr2}$

我试图实现代码Anthon以适应我的情况,但它一点也没有帮助,因为YAML文件的缩进级别与我的不同。
示例:

import sys
import ruamel.yaml

yaml = ruamel.yaml.YAML()
# yaml.preserve_quotes = True
with open('input.yaml') as fp:
    data = yaml.load(fp)
for elem in data:
    if elem['name'] == 'Stuart':
         elem['hobbies'] = ['Fishing']
         break  # no need to iterate further
yaml.dump(data, sys.stdout)

我得到错误“TypeError('string index must be integers',)”,我知道这段代码可能完全错误,但我是新手拉梅尔亚姆勒. 在

如何编码?在


Tags: 文件代码nameimportyamlinputdatasys
2条回答

感谢您的代码运行正常,我必须按如下方式编辑此代码:

import sys
import ruamel.yaml
from pathlib import Path

yaml = ruamel.yaml.YAML()
path = Path('input.yaml')
yaml.indent(sequence=4, offset=2)  # for the non-default indentation of sequences
with open(path) as fp:
    data = yaml.load(fp)
for key in data:
    value = data[key]
    if value['name'] == 'Stuart':
         if len(value['hobbies']) == 1:
             value['hobbies'][0] = value['hobbies'][0].capitalize()
         value['hobbies'].append('Fishing')
    elif value['name'] == 'Max':
         last_item_index = len(value['hobbies']) - 1
         value['hobbies'].append('Painting')
         comments = value['hobbies'].ca
         if not comments.items[last_item_index][0].value.strip():
             # move empty comment lines from previous last item to new last item
             comments.items[last_item_index + 1] = comments.items.pop(last_item_index)
yaml.dump(data, path)

错误信息显示为第9行。指的是线

    if elem['name'] == 'Stuart':

如果这还不能给你一个线索,我在这种情况下推荐的方法是开始添加一些print函数,这样你就知道你在做什么了。for循环如下所示:

^{pr2}$

这个指纹

 elem team_member

在抛出异常之前,我希望这会让你意识到你不是在列表的elements(项)上迭代,而是遍历dict的(根据YAML中的根级映射构造)。与键相关联的是具有键name和键hobbies的对象。在

然后用cd5}来处理{{cd5}中的值,然后用cd5}来处理{cd5}的值:

for key in data:
    value = data[key]
    if value['name'] == 'Stuart':
         print('value->hobbies', value['hobbies'])
         value['hobbies'] = ['Fishing']

这样可以得到:

value->hobbies ['dancing']
team_member:
  name: Max
  hobbies:
  - Reading

team_leader:
  name: Stuart
  hobbies:
  - Fishing

所以我们去掉了异常,但是结果并不是你想要的。键“hobients”的元素dancing不见了,因为您为该键指定了一个新的(list)值,而您应该做的是将一个项目附加到列表中。我们现在还可以取消打印功能:

for key in data:
    value = data[key]
    if value['name'] == 'Stuart':
         value['hobbies'].append('Fishing')

这将得到文件中最后一个序列中的两个项目。还有一些事情需要解决:

  • dancing的大写不正确。若要更正此问题,请在只有一个元素时添加一行处理该列表
  • 需要添加名称Max的代码(这就是为什么您需要去掉代码中的break
  • 空行被认为是对第一个序列的最后一个元素的注释,该注释需要被移动
  • 序列缩进是非默认的

最终代码如下:

from pathlib import Path
import ruamel.yaml

path = Path('input.yaml')
yaml = ruamel.yaml.YAML()
yaml.indent(sequence=4, offset=2)  # for the non-default indentation of sequences

data = yaml.load(path)
for key in data:
    value = data[key]
    if value['name'] == 'Stuart':
         if len(value['hobbies']) == 1:
             value['hobbies'][0] = value['hobbies'][0].capitalize()
         value['hobbies'].append('Fishing')
    elif value['name'] == 'Max':
         last_item_index = len(value['hobbies']) - 1
         value['hobbies'].append('Painting')
         comments = value['hobbies'].ca
         if not comments.items[last_item_index][0].value.strip():
             # move empty comment lines from previous last item to new last item
             comments.items[last_item_index + 1] = comments.items.pop(last_item_index)

yaml.dump(data, path)

这和你想要的很接近

team_member:
  name: Max
  hobbies:
    - Reading
    - Painting

team_leader:
  name: Stuart
  hobbies:
    - Dancing
    - Fishing

¹前两行的备选方案:for key, value in data.items()

相关问题 更多 >