質問

iは、リスト/辞書、タプルで構成されるPython構造を人間が読める形式に保存する必要があります。アイデアは、 pickle に似たものを使用するようなものですが、pickleは人間に優しいものではありません。私の頭に浮かぶ他のオプションは、 YAML PyYAML および JSON simplejson )シリアライザー。

思い浮かぶ他のオプションはありますか?

事前に感謝します。

役に立ちましたか?

解決

単純な場合、pprint()とeval()が思い浮かびます。

例を使用:

>>> d = {'age': 27,
...  'name': 'Joe',
...  'numbers': [1, 
...              2, 
...              3,
...              4,
...              5],
...  'subdict': {
...              'first': 1, 
...              'second': 2,
...               'third': 3
...              }
... }
>>> 
>>> from pprint import pprint
>>> pprint(d)
{'age': 27,
 'name': 'Joe',
 'numbers': [1, 2, 3, 4, 5],
 'subdict': {'first': 1, 'second': 2, 'third': 3}}
>>> 

同じツールを使用して2つの要件を修正することについて、もう一度考えます。シリアル化にpickleを使用し、次にオブジェクトを見る人間にpprint()(またはより洗練されたオブジェクトビューアー)を使用することを検討しましたか?

他のヒント

その just Pythonリスト、辞書、およびタプルオブジェクトの場合。 - JSON が方法です。人間が読める、非常に扱いやすく、言語に依存しない。

注意:タプルはsimplejsonでリストに変換されます。

In [109]: simplejson.loads(simplejson.dumps({'d':(12,3,4,4,5)}))
Out[109]: {u'd': [12, 3, 4, 4, 5]}

JSONでカバーされるよりも多くの表現が必要な場合は、 PyON (Python Object Notation)... ast モジュールに依存しているため、2.6 / 3.0以上に制限されていると思いますが。 JSONが提供する以上の機能の中で、カスタムクラスインスタンスと再帰データ型を処理します。

jsonpickle( https://github.com/jsonpickle/jsonpickle )をチェックアウトする必要があります。 Pythonオブジェクトをjsonファイルに書き出します。その後、そのファイルをPythonオブジェクトに読み戻すことができます。良いことは、jsonであるため、中間ファイルが非常に読みやすいことです。

これは人間が読めないということですか? ;)

>>> d = {'age': 27, 
...   'name': 'Joe',
...   'numbers': [1,2,3,4,5],
...   'subdict': {'first':1, 'second':2, 'third':3}
... }
>>> 
>>> import pickle
>>> p = pickle.dumps(d)      
>>> p
"(dp0\nS'age'\np1\nI27\nsS'subdict'\np2\n(dp3\nS'second'\np4\nI2\nsS'third'\np5\nI3\nsS'first'\np6\nI1\nssS'name'\np7\nS'Joe'\np8\nsS'numbers'\np9\n(lp10\nI1\naI2\naI3\naI4\naI5\nas."

OK、まあ、たぶん少し練習が必要なのかもしれません…またはカンニングすることもできます...

>>> import pickletools 
>>> pickletools.dis(p)
    0: (    MARK
    1: d        DICT       (MARK at 0)
    2: p    PUT        0
    5: S    STRING     'age'
   12: p    PUT        1
   15: I    INT        27
   19: s    SETITEM
   20: S    STRING     'subdict'
   31: p    PUT        2
   34: (    MARK
   35: d        DICT       (MARK at 34)
   36: p    PUT        3
   39: S    STRING     'second'
   49: p    PUT        4
   52: I    INT        2
   55: s    SETITEM
   56: S    STRING     'third'
   65: p    PUT        5
   68: I    INT        3
   71: s    SETITEM
   72: S    STRING     'first'
   81: p    PUT        6
   84: I    INT        1
   87: s    SETITEM
   88: s    SETITEM
   89: S    STRING     'name'
   97: p    PUT        7
  100: S    STRING     'Joe'
  107: p    PUT        8
  110: s    SETITEM
  111: S    STRING     'numbers'
  122: p    PUT        9
  125: (    MARK
  126: l        LIST       (MARK at 125)
  127: p    PUT        10
  131: I    INT        1
  134: a    APPEND
  135: I    INT        2
  138: a    APPEND
  139: I    INT        3
  142: a    APPEND
  143: I    INT        4
  146: a    APPEND
  147: I    INT        5
  150: a    APPEND
  151: s    SETITEM
  152: .    STOP
highest protocol among opcodes = 0
>>> 

ファイルからpickle化されたオブジェクトを読み取る必要がありますが、ロードする必要はありません。したがって、「危険」であればオブジェクトの場合、 load を実行する前にそれを把握できる可能性があります。 pickle で行き詰まっている場合、それはあなたが持っているものを解読するための良いオプションかもしれません。

最初にsimplejsonを使用するには easy_install simplejson

import simplejson
my_structure = {"name":"Joe", "age":27, "numbers":[1,2,3,4,5], "subdict":{"first":1, "second":2, "third": 3}}
json = simplejson.dumps(my_structure)

jsonの結果:

{"age": 27, "subdict": {"second": 2, "third": 3, "first": 1}, "name": "Joe", "numbers": [1, 2, 3, 4, 5]}

辞書の形式はほとんど変更されていないことに注意してください。ただし、有効なJSONデータを確認するには、この手順を実行する必要があります。

結果をさらにきれいに印刷できます:

import pprint
pprint.pprint(my_structure)

結果:

{'age': 27,
 'name': 'Joe',
 'numbers': [1, 2, 3, 4, 5],
 'subdict': {'first': 1, 'second': 2, 'third': 3}}

AXON (テキスト)形式は、ベスト JSON、XML、YAML。 AXON形式は非常に読みやすく、比較的コンパクトです。

Python(2.7 / 3.3-3.7)モジュール pyaxon load( s) / dump(s)機能(反復 loading / dumping を含む)。役に立つほど高速です。

簡単な例を検討してください:

>>> d = {
     'age': 27, 'name': 'Joe', 
     'numbers': [1, 2, 3, 4, 5], 
     'subdict': {'first': 1, 'second': 2, 'third': 3}
    }
# pretty form
>>> axon.dumps(d, pretty=1)
{ age: 27
  name: "Joe"
  numbers: [1 2 3 4 5]
  subdict: {
    first: 1
    second: 2
    third: 3}}
# compact form
>>> axon.dumps(d)
{age:27 name:"Joe" numbers:[1 2 3 4 5] subdict:{first:1 second:2 third:3}}

メッセージ内の複数のオブジェクトも処理できます:

>>> msg = axon.dumps([{'a':1, 'b':2, 'c':3}, {'a':2, 'b':3, 'c':4}])
>>> print(msg)
{a:1 b:2 c:3} 
{a:2 b:3 c:4}
{a:3 b:4 c:5}

その後、繰り返し読み込みます:

for d in axon.iloads(msg):
   print(d)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top