使用ruamel.yaml修改YAML会添加额外的新行 - python

我需要为YAML文件中的现有键添加额外的值。以下是我正在使用的代码。

with open(yaml_in_path, 'r') as f:
    doc, ind, bsi = load_yaml_guess_indent(f, preserve_quotes=True)
doc['phase1'] += ['c']
with open(yaml_out_path, 'w') as f:
    ruamel.yaml.round_trip_dump(doc, f,
                                indent=2, block_seq_indent=bsi)

这是输入和输出。

输入项

phase1:
  - a
  # a comment.
  - b

phase2:
  - d

输出量

phase1:
  - a
  # a comment.
  - b

  - c
phase2:
  - d

如何摆脱bc之间的新线? (当phase1是文件中的唯一键时,或者phase1phase2之间没有空行时,就不会出现此问题。)

python参考方案

这里的问题是,空行被认为是一种注释,并且ruamel.yaml中的注释通过将它们与序列中的元素或映射中的键相关联而得以保留。该值存储在名为ca的复杂属性中,该属性在与对象doc['phase1']相似的列表中,与第二个元素相关联。

您当然可以争辩说它应该在顶级映射/字典上关联,或者与键phase1(作为一些最终的空行注释)关联,或者与phase2作为一些介绍性的空行注释关联。
以上三个中的任何一个都是有效的,并且库中当前没有控制该策略的策略,在该策略中,空行(或添加了注释)。

如果您输入“真实”注释(以#开头的注释),它将与phase1作为结束注释关联,因为这些策略是不同的。

显然,这需要进行大修,因为ruamel.yaml的最初目标是:
-从YAML加载一些配置
-改变一些价值
-将配置保存到YAML
在这种情况下,不会出现此类附加/插入问题。

因此,直到对库进行扩展以对在何处附加(跟踪)注释和/或空行的控件进行控制,才有真正的解决方案。

在实现这种控制之前,可能最好的操作是:

import sys
import ruamel.yaml

yaml_str = """\
phase1:
  - a
  # a comment.
  - b

phase2:
  - d
"""

def append_move_comment(l, e):
    i = len(l) - 1
    l.append(e)
    x = l.ca.items[i][0]  # the end comment
    if x is None:
        return
    l.ca.items[i][0] = None
    l.ca.items[i+1] = [x, None, None, None]

data = ruamel.yaml.round_trip_load(yaml_str)
append_move_comment(data['phase1'], 'c')
ruamel.yaml.round_trip_dump(data, sys.stdout, indent=4, block_seq_indent=2)

我将indent值更改为4,这就是您输入的内容(之所以会得到,是因为您将block_seq_indent的值指定为小)。

R'relaimpo'软件包的Python端口 - python

我需要计算Lindeman-Merenda-Gold(LMG)分数,以进行回归分析。我发现R语言的relaimpo包下有该文件。不幸的是,我对R没有任何经验。我检查了互联网,但找不到。这个程序包有python端口吗?如果不存在,是否可以通过python使用该包? python参考方案 最近,我遇到了pingouin库。

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

Python:如何根据另一列元素明智地查找一列中的空单元格计数? - python

df = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice','Jane', 'Alice','Bob', 'Alice'], 'income…

Python pytz时区函数返回的时区为9分钟 - python

由于某些原因,我无法从以下代码中找出原因:>>> from pytz import timezone >>> timezone('America/Chicago') 我得到:<DstTzInfo 'America/Chicago' LMT-1 day, 18:09:00 STD…

将字符串分配给numpy.zeros数组[重复] - python

This question already has answers here: Weird behaviour initializing a numpy array of string data                                                                    (4个答案)         …