Pythonのドキュメントが提供する情報を確認しましたが、まだ少し混乱しています。誰かが新しいファイルを書き込むサンプルコードを投稿してから、pickleを使用して辞書をそこにダンプできますか?
Pythonのドキュメントが提供する情報を確認しましたが、まだ少し混乱しています。誰かが新しいファイルを書き込むサンプルコードを投稿してから、pickleを使用して辞書をそこにダンプできますか?
回答:
これを試して:
import pickle
a = {'hello': 'world'}
with open('filename.pickle', 'wb') as handle:
pickle.dump(a, handle, protocol=pickle.HIGHEST_PROTOCOL)
with open('filename.pickle', 'rb') as handle:
b = pickle.load(handle)
print a == b
pickle.HIGHEST_PROTOCOL
ですか?
__slots__
)。常にを使用する必要があるとは言ってHIGHEST_PROTOCOL
いませんが、プロトコル0または1を使用しないようにすることは、実際にはかなり重要です。
pickle.HIGHEST_PROTOCOL
実際には何をしますか?
import pickle
your_data = {'foo': 'bar'}
# Store data (serialize)
with open('filename.pickle', 'wb') as handle:
pickle.dump(your_data, handle, protocol=pickle.HIGHEST_PROTOCOL)
# Load data (deserialize)
with open('filename.pickle', 'rb') as handle:
unserialized_data = pickle.load(handle)
print(your_data == unserialized_data)
の利点HIGHEST_PROTOCOL
は、ファイルが小さくなることです。これにより、unpickleが大幅に高速化されることがあります。
重要なお知らせ:pickleの最大ファイルサイズは約2GBです。
import mpu
your_data = {'foo': 'bar'}
mpu.io.write('filename.pickle', data)
unserialized_data = mpu.io.read('filename.pickle')
アプリケーションでは、次のことが重要になる場合があります。
構成ファイルを作成する方法を探している場合は、短い記事「Pythonでの構成ファイル」を読んでください。
# Save a dictionary into a pickle file.
import pickle
favorite_color = {"lion": "yellow", "kitty": "red"} # create a dictionary
pickle.dump(favorite_color, open("save.p", "wb")) # save it into a file named save.p
# -------------------------------------------------------------
# Load the dictionary back from the pickle file.
import pickle
favorite_color = pickle.load(open("save.p", "rb"))
# favorite_color is now {"lion": "yellow", "kitty": "red"}
一般的に、dict
文字列や整数などの単純なオブジェクトだけが含まれていない限り、aのピクルは失敗します。
Python 2.7.9 (default, Dec 11 2014, 01:21:43)
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from numpy import *
>>> type(globals())
<type 'dict'>
>>> import pickle
>>> pik = pickle.dumps(globals())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1374, in dumps
Pickler(file, protocol).dump(obj)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump
self.save(obj)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 663, in _batch_setitems
save(v)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 306, in save
rv = reduce(self.proto)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy_reg.py", line 70, in _reduce_ex
raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle module objects
>>>
本当にシンプルなものでも、dict
しばしば失敗します。内容次第です。
>>> d = {'x': lambda x:x}
>>> pik = pickle.dumps(d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1374, in dumps
Pickler(file, protocol).dump(obj)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump
self.save(obj)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 663, in _batch_setitems
save(v)
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 748, in save_global
(obj, module, name))
pickle.PicklingError: Can't pickle <function <lambda> at 0x102178668>: it's not found as __main__.<lambda>
ただし、dill
またはのようなより優れたシリアライザを使用するcloudpickle
と、ほとんどの辞書をピクルすることができます。
>>> import dill
>>> pik = dill.dumps(d)
またはdict
、ファイルに保存したい場合...
>>> with open('save.pik', 'w') as f:
... dill.dump(globals(), f)
...
後者の例は、ここに掲載されている他の良い答えと同じです(これは、内容のピックル性を無視していることを除けばdict
良いです)。
>>> import pickle
>>> with open("/tmp/picklefile", "wb") as f:
... pickle.dump({}, f)
...
通常はcPickle実装を使用することをお勧めします
>>> import cPickle as pickle
>>> help(pickle.dump)
Help on built-in function dump in module cPickle:
dump(...)
dump(obj, file, protocol=0) -- Write an object in pickle format to the given file.
See the Pickler docstring for the meaning of optional argument proto.
辞書を単一のファイルに保存したいだけなら、pickle
そのように使用します
import pickle
a = {'hello': 'world'}
with open('filename.pickle', 'wb') as handle:
pickle.dump(a, handle)
with open('filename.pickle', 'rb') as handle:
b = pickle.load(handle)
複数のディクショナリを複数のファイルに保存して復元し、より複雑なデータをキャッシュおよび保存するには、anycacheを使用します。それはあなたが周りに必要な他のすべてのものを行いますpickle
from anycache import anycache
@anycache(cachedir='path/to/files')
def myfunc(hello):
return {'hello', hello}
Anycacheは、myfunc
異なるファイルへの引数に応じて異なる結果を格納しますcachedir
それらを再ロードします。
詳細については、ドキュメントを参照してください。
Pythonデータ(辞書など)をpickleファイルにダンプする簡単な方法。
import pickle
your_dictionary = {}
pickle.dump(your_dictionary, open('pickle_file_name.p', 'wb'))
私は酸洗いが混乱していることを発見しました(おそらく私は太いためです)。しかし、これはうまくいくことがわかりました:
myDictionaryString=str(myDictionary)
これをテキストファイルに書き込むことができます。.datファイルに整数を書き込むように指示するエラーが発生したため、ピクルスの使用を中止しました。漬物を使わなかったことをお詫びします。
dict
オブジェクトにさらに深さを含めることは非常に合理的です。名前)および/または完全な文字列表現のないオブジェクト。