首页 > 其他 > 详细

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

时间:2021-07-06 18:30:04      阅读:55      评论: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 版权所有
打开技术之扣,分享程序人生!