How can I use pickle to save a dict?
我查看了Python文档提供的信息,但我仍然有点困惑。 有人可以发布编写新文件的示例代码,然后使用pickle将字典转储到其中吗?
试试这个:
1 2 3 4 5 6 7 8 9 10 11 | 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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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) |
重要提示:pickle的最大文件大小约为2GB。
替代方式
1 2 3 4 | import mpu your_data = {'foo': 'bar'} mpu.io.write('filename.pickle', data) unserialized_data = mpu.io.read('filename.pickle') |
替代格式
- CSV:超简单格式(读写)
- JSON:很适合编写人类可读的数据;非常常用(读写)
- YAML:YAML是JSON的超集,但更容易阅读(读写,JSON和YAML的比较)
- pickle:Python序列化格式(读写)
- MessagePack(Python包):更紧凑的表示(读写)
- HDF5(Python包):很适合矩阵(读写)
- XML:也存在*叹气*(读写)
对于您的应用程序,以下可能很重要:
- 其他编程语言的支持
- 读/写性能
- 紧凑性(文件大小)
另请参见:数据序列化格式的比较
如果您正在寻找一种制作配置文件的方法,您可能希望阅读我的简短文章Python中的配置文件
1 2 3 4 5 6 7 8 9 10 11 12 | # 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"} |
通常,除非你只有简单的对象,如字符串和整数,否则酸洗
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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 >>> |
即使是非常简单的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | >>> 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> |
但是,如果您使用更好的序列化程序,如
1 2 | >>> import dill >>> pik = dill.dumps(d) |
或者,如果要将
1 2 3 | >>> with open('save.pik', 'w') as f: ... dill.dump(globals(), f) ... |
后一个例子与这里发布的任何其他好的答案相同(除了忽略
1 2 3 4 | >>> import pickle >>> with open("/tmp/picklefile","wb") as f: ... pickle.dump({}, f) ... |
通常,最好使用cPickle实现
1 2 3 4 5 6 7 8 | >>> 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. |
将Python数据(例如字典)转储到pickle文件的简单方法。
1 2 3 4 5 | import pickle your_dictionary = {} pickle.dump(your_dictionary, open('pickle_file_name.p', 'wb')) |
如果您只想将dict存储在单个文件中,请使用
1 2 3 4 5 6 7 8 9 | 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。
它完成了
1 2 3 4 5 | from anycache import anycache @anycache(cachedir='path/to/files') def myfunc(hello): return {'hello', hello} |
Anycache根据参数存储不同的
有关更多详细信息,请参阅文档。
1 2 3 4 5 6 7 8 9 10 11 | import pickle dictobj = {'Jack' : 123, 'John' : 456} filename ="/foldername/filestore" fileobj = open(filename, 'wb') pickle.dump(dictobj, fileobj) fileobj.close() |
我发现酸洗令人困惑(可能是因为我很厚)。我发现这有效,但是:
1 | myDictionaryString=str(myDictionary) |
然后您可以将其写入文本文件。我放弃了尝试使用pickle,因为我收到错误告诉我将整数写入.dat文件。我为不使用泡菜而道歉。