web-dev-qa-db-ja.com

Pythonでデータ構造をファイルに永続化する最も簡単な方法は?

私がこのようなものを持っているとしましょう:

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

progammaticallyを読み込む最も簡単な方法は何ですか。後でpythonからロードできるファイルに保存しますか?

どういうわけかそれをpythonソース(pythonスクリプト内から、手動ではなく!)から)として保存し、後でimportとして保存できますか?

それともJSONか何かを使うべきですか?

35

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
61

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

pickle は、「任意のオブジェクトをファイルに書き込んで復元する」限り、おそらく最もシンプルで最も機能的です。カスタムクラスと循環参照を自動的に処理できます。

最高の酸洗いパフォーマンス(速度とスペース)を得るには、HIGHEST_PROTOCOLcPickleを使用します。

15
Miles

永続的な辞書を提供するshelveモジュールを試してみてください、例えば:

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

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

shelf.close()

....

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

[〜#〜] json [〜#〜] には問題がありますが、ニーズに合っている場合は次のようになります。

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

Zope's Object Database を見るとさらに複雑になるかもしれません:-)おそらくあなたが持っているものに対してはやり過ぎですが、それはうまくスケーリングし、使用するのはそれほど難しくありません。

5
Jay Atkinson

読みやすいJSONのような形式で保存する場合は、reprを使用してオブジェクトをシリアル化し、evalを使用してオブジェクトを逆シリアル化します。

repr(object) -> string

オブジェクトの正規の文字列表現を返します。ほとんどのオブジェクトタイプの場合、eval(repr(object)) == object

3
John Kugelman

前の提案に追加するために、ファイル形式を簡単に読み取りおよび変更できるようにしたい場合は、 [〜#〜] yaml [〜#〜] を使用することもできます。入れ子になったdictやリストに対しては非常にうまく機能しますが、より複雑なデータ構造(つまり、カスタムオブジェクトを含むもの)に対してもスケーリングします。その大きなプラスは、フォーマットが読みやすいことです。

3
Eli Bendersky