Python 使用pprint并跳过类型名称
我想使用Python 使用pprint并跳过类型名称,python,printing,pprint,Python,Printing,Pprint,我想使用pprint打印一些复杂的列表,请参见下面的示例: >>> x = [OrderedDict([(u'D-ID', u'clci-2'), (u'R', u'1691')]), OrderedDict([(u'D-ID', u'dallas-pcc-1'), (u'R', u'5498')]), OrderedDict([(u'D-ID', u'gx-1'), (u'R', u'2275')]), OrderedDict([(u'D-ID', u'gx-2'), (u'
pprint
打印一些复杂的列表,请参见下面的示例:
>>> x = [OrderedDict([(u'D-ID', u'clci-2'), (u'R', u'1691')]), OrderedDict([(u'D-ID', u'dallas-pcc-1'), (u'R', u'5498')]), OrderedDict([(u'D-ID', u'gx-1'), (u'R', u'2275')]), OrderedDict([(u'D-ID', u'gx-2'), (u'R', u'0')]), OrderedDict([(u'D-ID', u'ocs-1'), (u'R', u'31735')]), OrderedDict([(u'D-ID', u'ocs-2'), (u'R', u'0')]), OrderedDict([(u'D-ID', u'pcc-gx-1'), (u'R', u'46351')]), OrderedDict([(u'D-ID', u'rgx-1'), (u'R', u'907')]), OrderedDict([(u'D-ID', u'rgx-2'), (u'R', u'1010')]), OrderedDict([(u'D-ID', u'rocs-1'), (u'R', u'915')]), OrderedDict([(u'D-ID', u'rocs-2'), (u'R', u'1033')])]
>>> pprint.pprint(x)
[OrderedDict([(u'D-ID', u'clci-2'), (u'R', u'1691')]),
OrderedDict([(u'D-ID', u'dallas-pcc-1'), (u'R', u'5498')]),
OrderedDict([(u'D-ID', u'gx-1'), (u'R', u'2275')]),
OrderedDict([(u'D-ID', u'gx-2'), (u'R', u'0')]),
OrderedDict([(u'D-ID', u'ocs-1'), (u'R', u'31735')]),
OrderedDict([(u'D-ID', u'ocs-2'), (u'R', u'0')]),
OrderedDict([(u'D-ID', u'pcc-gx-1'), (u'R', u'46351')]),
OrderedDict([(u'D-ID', u'rgx-1'), (u'R', u'907')]),
OrderedDict([(u'D-ID', u'rgx-2'), (u'R', u'1010')]),
OrderedDict([(u'D-ID', u'rocs-1'), (u'R', u'915')]),
OrderedDict([(u'D-ID', u'rocs-2'), (u'R', u'1033')])]
这很好,只是我想删除所有类型名(orderedict&u
)和所有不必要的[]
)可以使用pprint吗?
>>> import pprint
>>> from collections import OrderedDict
>>> x = [OrderedDict([(u'D-ID', u'clci-2'), (u'R', u'1691')]), OrderedDict([(u'D-ID', u'dallas-pcc-1'), (u'R', u'5498')]), OrderedDict([(u'D-ID', u'gx-1'), (u'R', u'2275')]), OrderedDict([(u'D-ID', u'gx-2'), (u'R', u'0')]), OrderedDict([(u'D-ID', u'ocs-1'), (u'R', u'31735')]), OrderedDict([(u'D-ID', u'ocs-2'), (u'R', u'0')]), OrderedDict([(u'D-ID', u'pcc-gx-1'), (u'R', u'46351')]), OrderedDict([(u'D-ID', u'rgx-1'), (u'R', u'907')]), OrderedDict([(u'D-ID', u'rgx-2'), (u'R', u'1010')]), OrderedDict([(u'D-ID', u'rocs-1'), (u'R', u'915')]), OrderedDict([(u'D-ID', u'rocs-2'), (u'R', u'1033')])]
>>> print pprint.pformat(x).replace("OrderedDict([", "(") \
.replace("u'", "'") \
.replace("])", ")")
[(('D-ID', 'clci-2'), ('R', '1691')),
(('D-ID', 'dallas-pcc-1'), ('R', '5498')),
(('D-ID', 'gx-1'), ('R', '2275')),
(('D-ID', 'gx-2'), ('R', '0')),
(('D-ID', 'ocs-1'), ('R', '31735')),
(('D-ID', 'ocs-2'), ('R', '0')),
(('D-ID', 'pcc-gx-1'), ('R', '46351')),
(('D-ID', 'rgx-1'), ('R', '907')),
(('D-ID', 'rgx-2'), ('R', '1010')),
(('D-ID', 'rocs-1'), ('R', '915')),
(('D-ID', 'rocs-2'), ('R', '1033'))]
根据您的需要调整
replace
s,我认为这看起来足够干净您需要创建自己的子类,并重写.format()
方法:
from pprint import PrettyPrinter, _recursion
class MyPrettyPrinter(PrettyPrinter):
def format(self, object, context, maxlevels, level):
if isinstance(object, OrderedDict):
if not object:
return "()", True, False
objid = id(object)
if maxlevels and level >= maxlevels:
return "(...)", False, objid in context
if objid in context:
return _recursion(object), False, True
context[objid] = 1
readable = True
recursive = False
components = []
append = components.append
level += 1
selfformat = self.format
for k, v in sorted(object.items()):
krepr, kreadable, krecur = selfformat(k, context, maxlevels, level)
vrepr, vreadable, vrecur = selfformat(v, context, maxlevels, level)
append('({}, {})'.format(krepr, vrepr))
readable = readable and kreadable and vreadable
if krecur or vrecur:
recursive = True
del context[objid]
return '({})'.format(', '.join(components)), readable, recursive
formatted, readable, recursion = PrettyPrinter.format(self, object, context, maxlevels, level)
if isinstance(object, unicode):
formatted = formatted.lstrip('u')
return formatted, readable, recursion
我们让基类完成大部分工作,只显式地格式化OrderedDict
;它有一个自定义的\uuu repr\uuu
,这意味着原始的pprint
实现只是使用它,而不是在它上面递归
然后使用此类,而不是直接调用pprint.pprint()
:
这将产生:
>>> mypprint = MyPrettyPrinter()
>>> mypprint.pprint(x)
[(('D-ID', 'clci-2'), ('R', '1691')),
(('D-ID', 'dallas-pcc-1'), ('R', '5498')),
(('D-ID', 'gx-1'), ('R', '2275')),
(('D-ID', 'gx-2'), ('R', '0')),
(('D-ID', 'ocs-1'), ('R', '31735')),
(('D-ID', 'ocs-2'), ('R', '0')),
(('D-ID', 'pcc-gx-1'), ('R', '46351')),
(('D-ID', 'rgx-1'), ('R', '907')),
(('D-ID', 'rgx-2'), ('R', '1010')),
(('D-ID', 'rocs-1'), ('R', '915')),
(('D-ID', 'rocs-2'), ('R', '1033'))]
如果只是为了打印一些
dict
和list
内容(或从它们继承的类中的内容),最好使用其他序列化,例如JSON:
import json
print json.dumps(obj)
为什么需要这样做?@jamylak我只需要打印上面这样的数据结构,跳过类型和[]是减小输出的好方法!怎么样
json.dumps
?@Boldewyn更好的主意,像这个主意一样提交itI,但我认为这不会拾取“内部”unicode字符串,如您的输出所示。@DSM:Urm,它不会递归。诅咒,所以我们需要递归自己,更新。@DSM:Better;由于自定义的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。
import json
print json.dumps(obj)