2009-06-26 11 views
23

だが、私はこのような何かを持っているとしましょう:Pythonでデータ構造をファイルに永続化する最も簡単な方法は?

d = { "abc" : [1, 2, 3], "qwerty" : [4,5,6] } 

への最も簡単な方法は、progammaticallyだ私は、後のpythonから読み込むことができるファイルにそれを取得しますか?

私は何とかPythonのソースとして保存することができます(手動ではない、Pythonスクリプト内から!)、そしてimportそれは、後に?

または私はJSONか何かを使用する必要がありますか?

+0

はここより夫婦の[データセット](https://dataset.readthedocs.org/en/latest/)と[jsonpickle](http://jsonpickle.github.io)。 – zekel

答えて

48

pickleモジュールを使用してください。

import pickle 
d = { "abc" : [1, 2, 3], "qwerty" : [4,5,6] } 
afile = open(r'C:\d.pkl', 'wb') 
pickle.dump(d, afile) 
afile.close() 

#reload object from file 
file2 = open(r'C:\d.pkl', 'rb') 
new_d = pickle.load(file2) 
file2.close() 

#print dictionary object loaded from file 
print new_d 
+0

パスの平均の前にあるrは何ですか? – Blorgbeard

+0

また、それは私に "TypeError:テキストストリームにバイトを書き込めません"ということを与えています - それはPython 3.0では何か違うのですか? – Blorgbeard

+2

r "は生の文字列を表し、http://docs.python.org/reference/lexical_analysis.html#string-literalsで説明されています。基本的には、文字列内のバックスラッシュは文字エスケープではなく、リテラルのバックスラッシュとして含まれています(ただし、生の文字列はバックスラッシュで終了できません)。 – Miles

3

JSONライクな形式で保存する場合は、reprを使用してオブジェクトをシリアル化し、evalを使用して逆シリアル化します。

repr(object) -> string

Return the canonical string representation of the object. For most object types, eval(repr(object)) == object .

+1

はhttp://docs.python.org/library/ast.html#ast()(ast.literal_eval考えてみましょう。literal_eval)をeval()の代わりに使用します。 – Miles

+0

私がこのソリューションについて気に入らない主な点は、eval(repr())のIDが保持されていない構造体にrepr()が "成功"し、eval()がbarfになるオブジェクトがあることです。 – Miles

+0

@ジョンあなたはその答えのために礼拝されるでしょう... S.Lottさんですか? – mhawke

11

お選びください:Python Standard Library - Data Persistanceどちらが最も適切かは、あなたの具体的なニーズによって異なります。

pickleはおそらく "ファイルに任意のオブジェクトを書き込んでそれを復元する"ということで、カスタムクラスと循環参照を自動的に処理できます。

最高の酸洗い性能(速度および空間)のために、をHIGHEST_PROTOCOLで使用してください。

5

たとえば、あなたに永続的な辞書を与える棚上げモジュールを試してみてください。

import shelve 
d = { "abc" : [1, 2, 3], "qwerty" : [4,5,6] } 

shelf = shelve.open('shelf_file') 
for key,val in d.items(): 
    shelf[key] = val 

shelf.close() 

.... 

# reopen the shelf 
shelf = shelve.open('shelf_file') 
print shelf # => {'qwerty': [4, 5, 6], 'abc': [1, 2, 3]} 
2

ちょうどあなたがファイル形式が読みやすいと修正になりたい場合は、あなたも使用することができ、以前の提案に追加しますYAML。それだけでなく、ネストされたdictsとリストが、より複雑なデータ構造のためのスケール(カスタムオブジェクトを含む、すなわちもの)のために非常にうまく機能し、その大きなプラスは、フォーマットが読み取り可能であることです。

2

JSONは、障害を持っているが、それはあなたのニーズを満たしているとき、それはまた、次のとおりです。

いることができ pickleに多少似 json module
  • インターフェース、などの標準ライブラリに含ま
  • を使用するのは簡単
    • より複雑な状況を処理する
    • デバッグ、共有、およびバージョン管理のための人間編集可能なテキスト
    • 有効なPythonコード
    • ウェブ上で十分に確立(あなたのプログラムは、そのドメインのいずれかに触れた場合)
  • +4

    JSONは有効なPythonではありません。表面的に見えますが、いくつかのboolを使用すると、問題が表示されます(JSONはTrueとFalseを使用し、PythonはTrueとFalseを使用します)。また、JSON配列(dicts)には文字列キーしかありません。したがって、データ構造は正しく保存されません。 –

    3

    また、あなたはあなたが持っているもののために:-)はおそらく行き過ぎ取得Zope's Object Databaseより複雑でご覧になる場合がありますそれはうまくスケールされ、使用するのが難しくありません。

    関連する問題