2013-06-02 30 views
4

使用pprint模塊打印對象時,有沒有乾淨的方法可以抑制unicode字符前綴?在使用pprint時抑制字符串上的Unicode字首

>>> import pprint 
>>> pprint.pprint({u'foo': u'bar', u'baz': [u'apple', u'orange', u'pear', u'guava', u'banana'], u'hello': u'world'}) 
{u'baz': [u'apple', u'orange', u'pear', u'guava', u'banana'], 
u'foo': u'bar', 
u'hello': u'world'} 

這看起來很醜。有沒有辦法打印每個對象的__str__值,而不是__repr__?

+0

如果你打印每個對象的'__str__',你也不會得到引號。那真的是你想要的嗎? – abarnert

+0

是的,這就是我想要的 – jterrace

+0

那麼你爲什麼不這樣說,你爲什麼接受不刪除引號的答案? – abarnert

回答

9

它可以通過覆蓋PrettyPrinter對象的格式方法,鑄造任何Unicode對象字符串進行:

import pprint 

def my_safe_repr(object, context, maxlevels, level): 
    typ = pprint._type(object) 
    if typ is unicode: 
     object = str(object) 
    return pprint._safe_repr(object, context, maxlevels, level) 

printer = pprint.PrettyPrinter() 
printer.format = my_safe_repr 
printer.pprint({u'foo': u'bar', u'baz': [u'apple', u'orange', u'pear', u'guava', u'banana'], u'hello': u'world'}) 

這給:

{'baz': ['apple', 'orange', 'pear', 'guava', 'banana'], 
'foo': 'bar', 
'hello': 'world'} 
+0

不幸的是它給了例外 UnicodeEncodeError:'ascii'編解碼器不能編碼位置0-4的字符:序號不在範圍內(128) 當ie {u'ключ':u'значение'} – Alexey

+2

確實,你的字符串是純Unicode字符串,所以它們不能轉換爲ASCII。你不應該考慮'刪除unicode前綴',因爲它對你的情況沒有任何意義。 –

+0

我通過在將值轉換爲str之前對值進行編碼來解決此問題 – Alexey

1

不,pprint打印表示。這不是爲了製作漂亮的最終用戶輸出,而是爲了以可讀的方式打印Python對象。

The pprint module provides a capability to 「pretty-print」 arbitrary Python data structures in a form which can be used as input to the interpreter.

+0

以可讀方式打印大型嵌套結構的另一種方法是什麼? – jterrace

+0

嗯,我發現[prettyprint](https://github.com/taichino/prettyprint)模塊,看起來相當不錯。 – jterrace

2

這可能是太多,但一個可能的方式是,實現對輸出流的包裝:

import pprint,sys,re 

class writer : 
    def write(self, text): 
     text=re.sub(r'u\'([^\']*)\'', r'\1',text) 
     sys.stdout.write(text) 

wrt=writer() 
d = { u'foo': u'bar', u'baz': 
     [u'apple', u'orange', u'pear', u'guava', u'banana'], 
     u'hello': u'world'} 
pp = pprint.PrettyPrinter(stream=wrt) 

pp.pprint(d) 

輸出:

{baz: [apple, orange, pear, guava, banana], 
foo: bar, 
hello: world} 

它也有可能在父母的內部引用單引號字符串,e,g,'foo':'bar':

text=re.sub(r'u(\'[^\']*\')', r'\1',text) 

這給:

{'baz': ['apple', 'orange', 'pear', 'guava', 'banana'], 
'foo': 'bar', 
'hello': 'world'}