我无法在保留注释的同时从YAML文件加载十六进制值.我需要将其转储为十六进制数字,而不是十六进制字符串.输出文件的 struct 必须与另一个程序读取的输入文件的 struct 相同.

以下是我的YAML文件的一般 struct :

myvalue: 0x12 # This is my value
othervalue: "foo"
bar:
  value1: true # This value is true
  value2: 4627

在回答similar question's之后,我try 添加一个表示者来处理十六进制数据:

class HexInt(int): pass
 
def representer(dumper, data):
    return ruamel.yaml.ScalarNode('tag:yaml.org,2002:int', hex(data))

ruamel.yaml.add_representer(HexInt, representer)

但要将十六进制数据作为字符串加载,我必须将YAML对象上的type参数设置为"base",从而消除注释.

有没有办法既能加载和转储十六进制值,又能保持注释的完整性?

推荐答案

您提到的"类似问题"是基于PyYAML的,虽然已经有ruamel.yaml个 因此,现在在能力方面存在着相当大的差异,尽管有些机制(如 添加表示者)仍然使用相同的方法.

虽然最初开发ruamel.yaml是为了支持保留注释.它还结合了大部分 存在于PyYAML中的相同的、重复的、用于Python2和3的源树(以便实现缺失 YAML 1.1功能以及升级到YAML 1.2)

从那时起,还实现了其他的"保留",包括(可选的)标量引号, 锚/别名和number formatting.

虽然可以编写自己的表示程序来处理注释,但这不是微不足道的. 如果您想加载(和转储)一个十六进制值,只需按原样使用ruamel.yaml,然后操作 值(不知道它是什么类型),或显式使用十六进制整数的内置类型:

import sys
import ruamel.yaml

yaml_str = """\
myvalue: 0x12 # This is my value
othervalue: "foo"
bar:
  value1: true # This value is true
  value2: 4627
"""
    
yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
data = yaml.load(yaml_str)
org = int(data['myvalue'])
print(f'{data["myvalue"]=}')
data['myvalue'] //= org  # set to 0x01
data['myvalue'] *= 42    # and multiply
data['bar']['value1'] = ruamel.yaml.scalarint.HexInt(42)
comment = data['bar'].ca.items['value1'][2]
comment.value = comment.value.replace(' is ', ' used to be ')
print()
yaml.dump(data, sys.stdout)

这提供了:

data["myvalue"]=18

myvalue: 0x2a # This is my value
othervalue: "foo"
bar:
  value1: 0x2a # This value used to be true
  value2: 4627

Python相关问答推荐

使用plotnine和Python构建地块

将DF中的名称与另一DF拆分并匹配并返回匹配的公司

try 在树叶 map 上应用覆盖磁贴

如何让剧作家等待Python中出现特定cookie(然后返回它)?

处理(潜在)不断增长的任务队列的并行/并行方法

将数据框架与导入的Excel文件一起使用

当从Docker的--env-file参数读取Python中的环境变量时,每个\n都会添加一个\'.如何没有额外的?

从groupby执行计算后创建新的子框架

Python,Fitting into a System of Equations

如何在Python脚本中附加一个Google tab(已经打开)

我想一列Panadas的Rashrame,这是一个URL,我保存为CSV,可以直接点击

改进大型数据集的框架性能

Python逻辑操作作为Pandas中的条件

如何防止Pandas将索引标为周期?

python中csv. Dictreader. fieldname的类型是什么?'

在Admin中显示从ManyToMany通过模型的筛选结果

仅使用预先计算的排序获取排序元素

如何用FFT确定频变幅值

Pandas:将值从一列移动到适当的列

在MongoDB文档中仅返回数组字段