使用python将十六进制转储到YAML中

时间:2013-09-06 21:25:38

标签: python hex yaml dump

现在我正在转入YAML文档。它在大多数情况下应该正常工作。当我尝试转储像“0x2A”这样的十六进制时,它会转换为42.是否有任何方法可以保持它的十六进制格式?一个字符串不会悲伤地工作。而int(0x2A,16)也只给我一个42。

3 个答案:

答案 0 :(得分:10)

这应该这样做:

>>> import yaml
>>> class HexInt(int): pass
... 
>>> def representer(dumper, data):
...     return yaml.ScalarNode('tag:yaml.org,2002:int', hex(data))
... 
>>> yaml.add_representer(HexInt, representer)
>>> yaml.dump({"n": HexInt(42)})
'{n: 0x2a}\n'

答案 1 :(得分:2)

可以使用以下内容完成以十六进制格式表示所有int而不使用HexInt类:

def hexint_presenter(dumper, data):
    return dumper.represent_int(hex(data))
yaml.add_representer(int, hexint_presenter)

参考this answer

答案 2 :(得分:1)

您可能正在寻找hex(0x2a) == hex(42) == '0x2a'

除非您正在寻找一种方法来说服现有的转储函数使用十六进制而不是十进制表示法...


回答下面的评论,如果问题是你想要十六进制数字的大写字母(但是0x的小写字母)那么你必须使用字符串格式。您可以选择以下其中一项:

"0x%02X" % 42                     # the old way
"0x{:02X}".format(42) == "0x2A"   # the new way

在这两种情况下,您都必须明确打印0x,然后是大写的至少两位数的十六进制数字,如果您的数字只有一位数,则左边填充零。这由格式02X表示,与C printf中的格式相同。