首页 > 其他 > 详细

使用 ruamel.yaml 读写 yaml 文档,解决16进制混搭10进制数据读出来全是10进制

时间:2021-07-06 18:30:04      阅读:48      评论:0      收藏:0      [点我收藏+]
import ruamel.yaml


class LaoLiuNiuBiVersionedResolver(ruamel.yaml.SafeLoader):
    def __init__(self, *args, **kwargs):
        super(LaoLiuNiuBiVersionedResolver, self).__init__(*args, **kwargs)
        self.yaml_constructors[tag:yaml.org,2002:hex] = self.parser_hex

    def parser_hex(self, _, node):

        return node.value

    def resolve(self, kind, value, implicit):

        if value and value.startswith(0x):
            return tag:yaml.org,2002:hex
        else:
            return super(LaoLiuNiuBiVersionedResolver, self).resolve(kind, value, implicit)


data = ruamel.yaml.load("""
x: 42
a: 0x2a
z: 0o52
""", Loader=LaoLiuNiuBiVersionedResolver)

print(data, )

写入的时候十六进制被转成了字符串,但是那个不能是字符串:

ruamel这个模块,你用round_trip_load取出来的时候,你16进制的数据,其实显示出来是10进制,但是你保存的时候又是16进制的,因为它内部做了一个转换

,自定义的类型叫HexInt,用这个类型保存16进制的,再写入进去的时候就可以完美解决了,不用做任何转换。

import ruamel.yaml
from ruamel import yaml
import sys
import json
from ruamel.yaml.scalarint import ScalarInt, BinaryInt, OctalInt, HexInt, HexCapsInt
with open(faucet.yaml,"r") as f:
    a = yaml.round_trip_load(f)
    f.close()

a["acls"]["system"][0]["rule"]["eth_type"] = HexInt(100)
with open(faucet.yaml, w) as nf:
    yaml.round_trip_dump(a, nf, Dumper=yaml.RoundTripDumper)
    nf.close()


# print(HexInt(300),type(HexInt(300)))

 

使用 ruamel.yaml 读写 yaml 文档,解决16进制混搭10进制数据读出来全是10进制

原文:https://www.cnblogs.com/kylin5201314/p/14977619.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!