Perlのモジュールと同じように使えるPythonのモジュールはありData::Dumper
ますか?
編集:申し訳ありませんが、もっと明確にする必要がありました。私は主に、永続化ではなくデータを検査するためのモジュールを求めていました。
ところで、答えてくれてありがとう。これは1つの素晴らしいサイトです!
Perlのモジュールと同じように使えるPythonのモジュールはありData::Dumper
ますか?
編集:申し訳ありませんが、もっと明確にする必要がありました。私は主に、永続化ではなくデータを検査するためのモジュールを求めていました。
ところで、答えてくれてありがとう。これは1つの素晴らしいサイトです!
一番近いのはpprintモジュールだと思います。
>>> l = [1, 2, 3, 4]
>>> l.append(l)
>>> d = {1: l, 2: 'this is a string'}
>>> print d
{1: [1, 2, 3, 4, [...]], 2: 'this is a string'}
>>> pprint.pprint(d)
{1: [1, 2, 3, 4, <Recursion on list with id=47898714920216>],
2: 'this is a string'}
私もかなり長い間 Data::Dumper を使用しており、適切にフォーマットされた複雑なデータ構造を表示する方法に慣れてきました。上記の pprint はかなりまともな仕事をしますが、私はその書式設定スタイルがあまり好きではありませんでした。さらに pprint では、Data::Dumper のようにオブジェクトを検査することはできません。
ネットで検索したところ、以下のサイトにたどり着きました。
https://gist.github.com/1071857#file_dumper.pyamazon
>>> y = { 1: [1,2,3], 2: [{'a':1},{'b':2}]}
>>> pp = pprint.PrettyPrinter(indent = 4)
>>> pp.pprint(y)
{ 1: [1, 2, 3], 2: [{ 'a': 1}, { 'b': 2}]}
>>> print(Dumper.dump(y)) # Dumper is the python module in the above link
{ 1: [ 1 2 3 ] 2: [ { 'a': 1 } { 'b': 2 } ] }
>>> print(Dumper.dump(pp))
インスタンス::pprint.PrettyPrinter __口述__ :: { '_depth': なし '_stream': ファイル:: > '_幅': 80 '_indent_per_level': 4 }
また、チェックする価値があるのはhttp://salmon-protocol.googlecode.com/svn-history/r24/trunk/salmon-playground/dumper.pyです。独自のスタイルがあり、便利なようです。
これは、辞書、リスト、またはタプルで構成されたネストされたデータをダンプするための簡単なソリューションです (私にとっては非常にうまく機能します)。
Python2
def printStruct(struc, indent=0):
if isinstance(struc, dict):
print ' '*indent+'{'
for key,val in struc.iteritems():
if isinstance(val, (dict, list, tuple)):
print ' '*(indent+1) + str(key) + '=> '
printStruct(val, indent+2)
else:
print ' '*(indent+1) + str(key) + '=> ' + str(val)
print ' '*indent+'}'
elif isinstance(struc, list):
print ' '*indent + '['
for item in struc:
printStruct(item, indent+1)
print ' '*indent + ']'
elif isinstance(struc, tuple):
print ' '*indent + '('
for item in struc:
printStruct(item, indent+1)
print ' '*indent + ')'
else: print ' '*indent + str(struc)
Python3
def printStruct(struc, indent=0):
if isinstance(struc, dict):
print (' '*indent+'{')
for key,val in struc.items():
if isinstance(val, (dict, list, tuple)):
print (' '*(indent+1) + str(key) + '=> ')
printStruct(val, indent+2)
else:
print (' '*(indent+1) + str(key) + '=> ' + str(val))
print (' '*indent+'}')
elif isinstance(struc, list):
print (' '*indent + '[')
for item in struc:
printStruct(item, indent+1)
print (' '*indent + ']')
elif isinstance(struc, tuple):
print (' '*indent + '(')
for item in struc:
printStruct(item, indent+1)
print (' '*indent + ')')
else: print (' '*indent + str(struc))
仕事でそれを見る:
>>> d = [{'a1':1, 'a2':2, 'a3':3}, [1,2,3], [{'b1':1, 'b2':2}, {'c1':1}], 'd1', 'd2', 'd3']
>>> printStruct(d)
[
{
a1=> 1
a3=> 3
a2=> 2
}
[
1
2
3
]
[
{
b1=> 1
b2=> 2
}
{
c1=> 1
}
]
d1
d2
d3
]
シリアル化には、多くのオプションがあります。
最良のものの 1 つは JSON です。これは、言語に依存しないシリアライゼーションの標準です。stdlibjson
モジュールの 2.6 で利用でき、それ以前はサードパーティsimplejson
モジュールの同じ API で利用できます。
marshal
かなり低レベルのを使用したくありません。それが提供するものが必要な場合は、ピクルスを使用します。
私は pickle の使用を避けています。この形式は Python のみであり、安全ではありません。pickle を使用してデシリアライズすると、任意のコードが実行される可能性があります。
pickle
、その C 実装を使用する必要があります。(するimport cPickle as pickle
。)デバッグの場合、通常はオブジェクトを調べたり、モジュールrepr
を使用したりします。pprint
オブジェクトを検査する限り、これは Data:Dumper と同等の便利なものであることがわかりました。
https://salmon-protocol.googlecode.com/svn-history/r24/trunk/salmon-playground/dumper.py
Google Code から Wayback Machine (archive.org) にアーカイブされたdumper.py
、
またはGoogle Code から Github にエクスポートされた
dumper.py
Unicode 文字列を処理できます。
すべての回答が、リストや辞書などの基本的なデータ型の組み合わせ以外のダンプを無視するというのは本当ではありませんか? Python Xlib Window オブジェクトで pprint を実行したところ、… <<class 'Xlib.display.Window'> 0x004001fe>
… 以上です。データ フィールドもメソッドもリストされていません。オブジェクトを実際にダンプするものはありますか? 例:そのすべての属性?