web-dev-qa-db-ja.com

データ構造を検査するためのPython PerlのData :: Dumperに相当するものはありますか?

Perlと同じ方法で使用できるPythonモジュールがあります Data::Dumper モジュール?

編集:申し訳ありませんが、私はより明確であったはずです。私は主に、永続化するのではなく、データを検査するためのモジュールを探していました。

ところで答えをありがとう。これは素晴らしいサイトです!

42
Rob Wells

Data :: Dumperには、データの永続化とオブジェクトのデバッグ/検査という2つの主な用途があります。私の知る限り、Data :: Dumperとまったく同じように機能するものはありません。

データの永続化には pickle を使用します。

pprint を使用して、オブジェクトを視覚的に検査/デバッグします。

32
jjfine

あなたが見つける最も近いものは 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'}
6
JimB

おそらくいくつかの選択肢: picklemarshalshelve

5

私もかなり前から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))
 instance :: pprint.PrettyPrinter 
 __dict__ :: {
 '_depth':None 
 '_stream':file ::> 
 '_width ':80 
' _indent_per_level ':4 
} 

また、チェックする価値があります http://salmon-protocol.googlecode.com/svn-history/r24/trunk/salmon-playground/dumper.py 独自のスタイルがあり、有用でもあるようです。

4
Saurabh Hirani

以下は、辞書、リスト、またはタプルで構成されるネストされたデータをダンプするための簡単なソリューションです(私には非常にうまく機能します)。

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)

Python

 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
]
4
qed
  • シリアライゼーションには、多くのオプションがあります。

    • 最高の1つはJSONであり、これは言語に依存しないシリアル化の標準です。 2.6ではstdlib json モジュールで利用可能で、その前にサードパーティのsimplejsonモジュールで同じAPIを使用できます。

    • 低レベルのmarshalを使用したくない。あなたがそれが提供するものを望んでいるなら、ピクルスを使うでしょう。

    • Pickleの使用は避け、形式はPythonのみで安全ではありません。 pickleを使用して逆シリアル化すると、任意のコードを実行できます。

      • pickleを使用した場合は、そのC実装を使用する必要があります。 (行う import cPickle as pickle。)
  • デバッグでは、通常、オブジェクトのreprを確認するか、pprintモジュールを使用します。

3
Mike Graham

オブジェクトの検査に関する限り、これはData:Dumperと同等の便利なものであることがわかりました。

https://salmon-protocol.googlecode.com/svn-history/r24/trunk/salmon-playground/dumper.py

Unicode文字列を処理できます。

1
Damon

Pprintよりも優れた機能が必要だが、独自にローリングする必要がない場合は、pypiからダンパーをインポートしてみてください。
https://github.com/jric/Dumper.py または https://github.com/ericholscher/pypi/blob/master/dumper.py

1

これを見て実現したPythonは、Data-:: Dumper in Dumper のように機能するものを持っています。作者はそれを次のように説明しています:

Dump Pythonデータ構造(クラスインスタンスを含む)が入れ子にされた、読みやすい形式のデータ構造。再帰的なデータ構造を適切に処理し、両方の方法でダンプの範囲を制限するための賢明なオプションがあります。単純な深さと、含まれているインスタンスの処理方法に関するいくつかのルール。

Pip経由でインストールします。 Githubリポジトリは https://github.com/jric/Dumper.py にあります。

0
sevenr

私はAPIリクエストに対してPerlのようなダンプを返す必要があったので、出力をきれいにフォーマットしないでこれを思い付きましたが、私にとっては完璧な仕事をしています。

from decimal import Decimal
from datetime import datetime, date

def dump(self, obj):

    if obj is None:
        return "undef"

    if isinstance(obj, dict):
        return self.dump_dict(obj)

    if isinstance(obj, (list, Tuple)):
        return self.dump_list(obj)

    if isinstance(obj, Decimal):
        return "'{:.05f}'".format(obj)
        # ... or handle it your way

    if isinstance(obj, (datetime, date)):
        return "'{}'".format(obj.isoformat(
            sep=' ',
            timespec='milliseconds'))
        # ... or handle it your way

    return "'{}'".format(obj)

def dump_dict(self, obj):
    result = []
    for key, val in obj.items():
        result.append(' => '.join((self.dump(key), self.dump(val))))

    return ' '.join(('{', ', '.join(result), '}'))

def dump_list(self, obj):
    result = []
    for val in obj:
        result.append(self.dump(val))

    return ' '.join(('[', ', '.join(result), ']'))



Using the above:

    example_dict = {'a': 'example1', 'b': 'example2', 'c': [1, 2, 3, 'asd'], 'd': [{'g': 'something1', 'e': 'something2'}, {'z': 'something1'}]}

    print(dump(example_dict))

will ouput:

    { 'b' => 'example2', 'a' => 'example1', 'd' => [ { 'g' => 'something1', 'e' => 'something2' }, { 'z' => 'something1' } ], 'c' => [ '1', '2', '3', 'asd' ] }
0
Mario Kirov