レポートの使用情報を含む.txtファイルを処理するPythonスクリプトがあります。pprintのpprint(vars(object))を使用してオブジェクトの属性をきれいに印刷する方法を見つけたいと思います。 ) 関数。
スクリプトはファイルを読み取り、Reportクラスのインスタンスを作成します。これがクラスです。
class Report(object):
def __init__(self, line, headers):
self.date_added=get_column_by_header(line,headers,"Date Added")
self.user=get_column_by_header(line,headers,"Login ID")
self.report=get_column_by_header(line,headers,"Search/Report Description")
self.price=get_column_by_header(line,headers,"Price")
self.retail_price=get_column_by_header(line,headers,"Retail Price")
def __str__(self):
from pprint import pprint
return str(pprint(vars(self)))
Reportのインスタンスをきれいにa-la-pprintで印刷できるようにしたいと思います。
for i,line in enumerate(open(path+file_1,'r')):
line=line.strip().split("|")
if i==0:
headers=line
if i==1:
record=Report(line,headers)
print record
私が電話するとき
print record
レポートの単一インスタンスの場合、これは私がシェルで取得するものです。
{'date_added': '1/3/2012 14:06',
'price': '0',
'report': 'some_report',
'retail_price': '0.25',
'user': 'some_username'}
None
私の質問は2つあります。
まず、これはオブジェクトの属性をきれいに印刷するための良い/望ましい方法ですか? pprintの有無にかかわらずこれを行うためのより良い方法はありますか?
第二に、なぜですか
None
最後にシェルに印刷しますか?私はそれがどこから来ているのか混乱しています。
ヒントをありがとう。
pprint
は単なる別の形式の印刷です。 pprint(vars(self))
と言うと、varsをstdoutに出力し、void関数であるためnoneを返します。したがって、文字列にキャストすると、None
(pprint
によって返される)が文字列に変換され、最初のprintステートメントから出力されます。印刷をpprint
に変更するか、印刷をすべて使用する場合は印刷として再定義することをお勧めします。
def __str__(self):
from pprint import pprint
return str(vars(self))
for i,line in enumerate(open(path+file_1,'r')):
line = line.strip().split("|")
if i == 0:
headers = line
if i == 1:
record = Report(line,headers)
pprint record
1つの代替方法は、フォーマットされた出力を使用することです。
def __str__(self):
return "date added: %s\nPrice: %s\nReport: %s\nretail price: %s\nuser: %s" % Tuple([str(i) for i in vars(self).values()])
これがお役に立てば幸いです
ダンの解決策は間違っており、イスマイルは不完全です。
__str__()
は呼び出されず、__repr__()
が呼び出されます。__repr__()
は、pformatと同様に、文字列を返す必要があります。これが例です
class S:
def __repr__(self):
from pprint import pformat
return pformat(vars(self), indent=4, width=1)
a = S()
a.b = 'bee'
a.c = {'cats': ['blacky', 'tiger'], 'dogs': ['rex', 'king'] }
a.d = S()
a.d.more_c = a.c
print(a)
このプリント
{ 'b': 'bee',
'c': { 'cats': [ 'blacky',
'tiger'],
'dogs': [ 'rex',
'king']},
'd': { 'more_c': { 'cats': [ 'blacky',
'tiger'],
'dogs': [ 'rex',
'king']}}}
これは完璧ではありませんが、まずまずです。
_pprint.pprint
_は文字列を返しません。実際に印刷を行います(デフォルトではstdoutですが、出力ストリームを指定できます)。したがって、_print record
_を記述すると、record.__str__()
が呼び出され、pprint
が呼び出され、None
が返されます。 str(None)
は_'None'
_であり、それはprint
edを取得します。そのため、None
が表示されます。
代わりに _pprint.pformat
_ を使用する必要があります。 (または、StringIO
インスタンスをpprint
に渡すこともできます。)
他のオブジェクトなどを含むプリティプリントオブジェクトの場合。pprint
では不十分です。 IPythonのlib.pretty を試してください。これは、Rubyモジュールに基づいています。
from IPython.lib.pretty import pprint
pprint(complex_object)
beeprint が必要だと思います。
ただpip install beeprint
そしてコードを次のように変更します。
def __str__(self):
from beeprint import pp
return pp(self, output=False)