मैंने उस जानकारी को देखा है जो पायथन डॉक्स देती है, लेकिन मैं अभी भी थोड़ा भ्रमित हूं। क्या कोई सैंपल कोड पोस्ट कर सकता है जो एक नई फ़ाइल लिखेगा और उसमें एक शब्दकोश को डंप करने के लिए अचार का उपयोग करेगा?
मैंने उस जानकारी को देखा है जो पायथन डॉक्स देती है, लेकिन मैं अभी भी थोड़ा भ्रमित हूं। क्या कोई सैंपल कोड पोस्ट कर सकता है जो एक नई फ़ाइल लिखेगा और उसमें एक शब्दकोश को डंप करने के लिए अचार का उपयोग करेगा?
जवाबों:
इसे इस्तेमाल करे:
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
यह है कि फाइलें छोटी हो जाती हैं। यह कभी-कभी बहुत तेज़ हो जाता है।
महत्वपूर्ण सूचना : अचार की अधिकतम फ़ाइल का आकार लगभग 2GB है।
import mpu
your_data = {'foo': 'bar'}
mpu.io.write('filename.pickle', data)
unserialized_data = mpu.io.read('filename.pickle')
आपके आवेदन के लिए, निम्नलिखित महत्वपूर्ण हो सकता है:
यह भी देखें: डेटा क्रमांकन प्रारूपों की तुलना
यदि आप विन्यास फाइल बनाने के लिए रास्ता ढूंढ रहे हैं, तो आप पायथन में मेरी संक्षिप्त लेख विन्यास फाइल पढ़ना चाहते हैं
# 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
तब तक विफल रहेगा जब तक कि आपके पास इसमें केवल साधारण वस्तुएं न हों, जैसे कि तार और पूर्णांक।
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)
यदि आप कैशिंग के लिए कई फ़ाइलों में कई शब्दकोशों को सहेजना और पुनर्स्थापित करना चाहते हैं और अधिक जटिल डेटा संग्रहीत करते हैं, तो किसी भी कैश का उपयोग करें । यह आपके आस-पास की जरूरत के अन्य सभी सामान करता हैpickle
from anycache import anycache
@anycache(cachedir='path/to/files')
def myfunc(hello):
return {'hello', hello}
myfunc
विभिन्न फाइलों में तर्कों के आधार पर एनाचे अलग-अलग परिणामों को संग्रहीत करता हैcachedir
और उन्हें फिर से लोड करता है।
देखें प्रलेखन किसी भी अधिक जानकारी के लिए।
अचार फ़ाइल में एक पायथन डेटा (जैसे शब्दकोश) को डंप करने का सरल तरीका।
import pickle
your_dictionary = {}
pickle.dump(your_dictionary, open('pickle_file_name.p', 'wb'))
import pickle
dictobj = {'Jack' : 123, 'John' : 456}
filename = "/foldername/filestore"
fileobj = open(filename, 'wb')
pickle.dump(dictobj, fileobj)
fileobj.close()
मैंने अचार को भ्रामक पाया है (संभवतः इसलिए कि मैं मोटा हूं)। मैंने पाया कि यह काम करता है, हालांकि:
myDictionaryString=str(myDictionary)
जिसे आप फिर एक टेक्स्ट फाइल पर लिख सकते हैं। मैंने अचार का उपयोग करने की कोशिश करना छोड़ दिया क्योंकि मुझे एक .dat फ़ाइल में पूर्णांक लिखने के लिए त्रुटियां हो रही थीं। मैं अचार का उपयोग नहीं करने के लिए माफी माँगता हूँ।
dict
वस्तुओं की और अधिक गहराई को समाहित करने के लिए बहुत ही उचित है (जिसे केवल मुद्रित किया जा सकता है) नाम) और / या किसी भी या पूर्ण स्ट्रिंग प्रतिनिधित्व के बिना वस्तुओं।