<p>错误信息显示为第9行。指的是线</p>
<pre><code> if elem['name'] == 'Stuart':
</code></pre>
<p>如果这还不能给你一个线索,我在这种情况下推荐的方法是开始添加一些<code>print</code>函数,这样你就知道你在做什么了。<code>for</code>循环如下所示:</p>
^{pr2}$
<p>这个指纹</p>
<pre><code> elem team_member
</code></pre>
<p>在抛出异常之前,我希望这会让你意识到你不是在列表的<em>elem</em>ents(项)上迭代,而是遍历dict的<em>键</em>(根据YAML中的根级映射构造)。与键相关联的<em>值</em>是具有键<code>name</code>和键<code>hobbies</code>的对象。在</p>
<p>然后用cd5}来处理{{cd5}中的值,然后用cd5}来处理{cd5}的值:</p>
<pre><code>for key in data:
value = data[key]
if value['name'] == 'Stuart':
print('value->hobbies', value['hobbies'])
value['hobbies'] = ['Fishing']
</code></pre>
<p>这样可以得到:</p>
<pre><code>value->hobbies ['dancing']
team_member:
name: Max
hobbies:
- Reading
team_leader:
name: Stuart
hobbies:
- Fishing
</code></pre>
<p>所以我们去掉了异常,但是结果并不是你想要的。键“hobients”的元素<code>dancing</code>不见了,因为您为该键指定了一个新的(list)值,而您应该做的是将一个项目附加到列表中。我们现在还可以取消打印功能:</p>
<pre><code>for key in data:
value = data[key]
if value['name'] == 'Stuart':
value['hobbies'].append('Fishing')
</code></pre>
<p>这将得到文件中最后一个序列中的两个项目。还有一些事情需要解决:</p>
<ul>
<li><code>dancing</code>的大写不正确。若要更正此问题,请在只有一个元素时添加一行处理该列表</li>
<li>需要添加名称<code>Max</code>的代码(这就是为什么您需要去掉代码中的<code>break</code>)</li>
<li>空行被认为是对第一个序列的最后一个元素的注释,该注释需要被移动</li>
<li>序列缩进是非默认的</li>
</ul>
<p>最终代码如下:</p>
<pre><code>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)
</code></pre>
<p>这和你想要的很接近</p>
<pre><code>team_member:
name: Max
hobbies:
- Reading
- Painting
team_leader:
name: Stuart
hobbies:
- Dancing
- Fishing
</code></pre>
<hr/>
<p>¹<sub>前两行的备选方案:<code>for key, value in data.items()</code></sub></p>