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

使用python将十六进制转储到YAML中,python,hex,yaml,dump,Python,Hex,Yaml,Dump,现在我正在将其转储到YAML文档中。它的工作,因为它应该为大部分。当我尝试转储十六进制数据(如“0x2A”)时,它会转换为42。有没有办法保持它的十六进制格式?不幸的是,一根绳子不行。int(0x2A,16)也只是给了我一个42。你可能在寻找hex(0x2A)==hex(42)='0x2A' 除非您正在寻找一种方法来说服您现有的转储函数使用十六进制而不是十进制表示法 回答下面的评论,如果问题是十六进制数字需要大写字母(而0x需要小写字母),则必须使用字符串格式。您可以选择以下选项之一: "0x

现在我正在将其转储到YAML文档中。它的工作,因为它应该为大部分。当我尝试转储十六进制数据(如“0x2A”)时,它会转换为42。有没有办法保持它的十六进制格式?不幸的是,一根绳子不行。int(0x2A,16)也只是给了我一个42。

你可能在寻找
hex(0x2A)==hex(42)='0x2A'

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


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

"0x%02X" % 42                     # the old way
"0x{:02X}".format(42) == "0x2A"   # the new way
在这两种情况下,您都必须显式地打印
0x
,后跟至少两位的十六进制数字(大写),如果您的数字只有一位,则用零填充。这由格式
02X
表示,与C的
printf

中的格式相同,应该这样做:

>>> 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'

使用十六进制格式表示所有
int
,不使用
HexInt
类,可以使用以下方法完成:

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

关于。

很遗憾,这不起作用:(.我需要整数格式,而不是str.但当我转换为整数时,它会变成十进制>:C.(例如:int(0x0)->0)整数是整数。它们不是十进制或十六进制;它们是位序列。区别在于打印它们的方式。不,我需要0x2A符号。我如何得到它?如果使用
safe\u dump
而不是
dump