【发布时间】:2012-02-24 10:03:04
【问题描述】:
目前我正在使用以下代码来打印大型数据结构
print(json.dumps(data, indent=4))
我想查看以十六进制而不是十进制打印的所有整数。那可能吗?似乎没有办法覆盖现有的整数编码器。您只能为 JSONEncoder 类尚未处理的类型提供默认值,但无法覆盖它对整数的编码方式。
我发现如果我在命令行中运行,我可以使用 sys.displayhook 覆盖默认的整数打印行为,但我不是。
仅供参考,数据结构是字典、列表、字符串、整数等的混合包。这就是我使用 json.dumps() 的原因。我能想到的唯一其他方法是自己解析它,然后我将重新编写 json 模块。
更新: 所以我最终用序列化函数来实现它,这些函数只打印原始数据结构的副本,所有整数类型都转换为十六进制字符串:
def odprint(self, hexify=False):
"""pretty print the ordered dictionary"""
def hexify_list(data):
_data = []
for i,v in enumerate(data):
if isinstance(v, (int,long)):
_data.insert(i,hex(v))
elif isinstance(v,list):
_data.insert(i, hexify_list(v))
else:
_data.insert(i, val)
return _data
def hexify_dict(data):
_data = odict()
for k,v in data.items():
if isinstance(v, (dict,odict)):
_data[k] = hexify_dict(v)
elif isinstance(v, (int, long)):
_data[k] = hex(v)
elif isinstance(v,list):
_data[k] = hexify_list(v)
else:
_data[k] = v
return _data
if hexify:
print(json.dumps(hexify_dict(self), indent=4))
else:
print(json.dumps(self, indent=4))
感谢您的帮助。我意识到我最终会从标准字典中制作一个 odict,但它只是用于打印,所以它可以满足我的需要。
【问题讨论】:
-
注意:您的 hexify_*() 函数可能会丢失数据。如果你走这条路,你可以使用something like
-
你能解释一下它是如何丢失数据的吗?
-
bare
else:确保它不会丢失数据,除非它消除了字符串/整数与十六进制数字之间的差异。我忽略了这一点。但它不会转换应该转换的数据,例如hexify_list()不会调用hexify_dict()。tuples 被忽略。顺便说一句,不要使用.insert(i, item),使用.append(item) -
有道理。这段代码对数据结构做了一些假设。 (即列表中没有字典,没有元组)。但我会让它更通用,以防有人决定更改数据结构。至于
.insertvs.append,为什么说“不要”使用?是性能问题吗?