Python Language
अचार डेटा क्रमांकन
खोज…
वाक्य - विन्यास
pickle.dump (ऑब्जेक्ट, फ़ाइल, प्रोटोकॉल) # किसी ऑब्जेक्ट को क्रमबद्ध करें
pickle.load (फ़ाइल) # किसी ऑब्जेक्ट को डी-सीरियल करना
pickle.dumps (ऑब्जेक्ट, प्रोटोकॉल) # किसी ऑब्जेक्ट को बाइट्स में क्रमबद्ध करने के लिए
अचार। बफ़र (बफर) # बाइट्स से एक ऑब्जेक्ट को डी-सीरियलज़ि करने के लिए
पैरामीटर
| पैरामीटर | विवरण |
|---|---|
| वस्तु | वह वस्तु जो संग्रहित की जाय |
| फ़ाइल | खुली फाइल जिसमें ऑब्जेक्ट होगा |
| मसविदा बनाना | ऑब्जेक्ट को चुनने के लिए उपयोग किया जाने वाला प्रोटोकॉल (वैकल्पिक पैरामीटर) |
| बफर | एक बाइट्स ऑब्जेक्ट जिसमें क्रमबद्ध ऑब्जेक्ट होता है |
टिप्पणियों
लेने योग्य प्रकार
निम्नलिखित वस्तुएं लेने योग्य हैं।
-
None,TrueऔरFalse - संख्या (सभी प्रकार की)
- तार (सभी प्रकार के)
-
tupleहै,listहै,set, औरdictही picklable वस्तुओं से युक्त - मॉड्यूल के शीर्ष स्तर पर परिभाषित कार्य
- अंतर्निहित कार्य
- एक मॉड्यूल के शीर्ष स्तर पर परिभाषित की जाने वाली कक्षाएं
- ऐसे वर्गों के उदाहरण जिनके
__dict__या__getstate__()को कॉल करने का नतीजा है, वह संग्रहणीय है (विवरण के लिए आधिकारिक डॉक्स देखें)।
- ऐसे वर्गों के उदाहरण जिनके
आधिकारिक पायथन प्रलेखन के आधार पर।
pickle और सुरक्षा
अचार मॉड्यूल सुरक्षित नहीं है । इंटरनेट से अधिक किसी अविश्वसनीय पार्टी से क्रमबद्ध डेटा प्राप्त करते समय इसका उपयोग नहीं किया जाना चाहिए।
अचार को क्रमबद्ध करने और किसी वस्तु को निष्क्रिय करने के लिए अचार का उपयोग करना
pickle मॉड्यूल एक बाइट्स की एक श्रृंखला में एक अनियंत्रित पायथन ऑब्जेक्ट को चालू करने के लिए एक एल्गोरिथ्म को लागू करता है। इस प्रक्रिया को ऑब्जेक्ट को क्रमबद्ध करना भी कहा जाता है। तब वस्तु का प्रतिनिधित्व करने वाली बाइट स्ट्रीम को प्रेषित या संग्रहीत किया जा सकता है, और बाद में उसी विशेषताओं के साथ एक नई वस्तु बनाने के लिए फिर से बनाया जा सकता है।
सरलतम कोड के लिए, हम dump() और load() फ़ंक्शन का उपयोग करते हैं।
वस्तु क्रमबद्ध करना
import pickle
# An arbitrary collection of objects supported by pickle.
data = {
'a': [1, 2.0, 3, 4+6j],
'b': ("character string", b"byte string"),
'c': {None, True, False}
}
with open('data.pickle', 'wb') as f:
# Pickle the 'data' dictionary using the highest protocol available.
pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
वस्तु को वशीभूत करना
import pickle
with open('data.pickle', 'rb') as f:
# The protocol version used is detected automatically, so we do not
# have to specify it.
data = pickle.load(f)
अचार और बाइट वस्तुओं का उपयोग करना
dumps और loads फ़ंक्शन का उपयोग करके बाइट ऑब्जेक्ट्स से बाहर निकलने और डिस्क्रिअलाइज़ करना भी संभव है, जो dump और load बराबर हैं।
serialized_data = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)
# type(serialized_data) is bytes
deserialized_data = pickle.loads(serialized_data)
# deserialized_data == data
मसालेदार डेटा को अनुकूलित करें
कुछ डेटा नहीं लिए जा सकते। अन्य कारणों से अन्य डेटा नहीं उठाया जाना चाहिए।
क्या __getstate__ जाएगा __getstate__ विधि में परिभाषित किया जा सकता है। इस विधि को कुछ ऐसा होना चाहिए जो कि संग्रहणीय हो।
__setstate__ तरफ __setstate__ : यह प्राप्त करेगा कि __getstate__ ने क्या बनाया है और ऑब्जेक्ट को इनिशियलाइज़ करना है।
class A(object):
def __init__(self, important_data):
self.important_data = important_data
# Add data which cannot be pickled:
self.func = lambda: 7
# Add data which should never be pickled, because it expires quickly:
self.is_up_to_date = False
def __getstate__(self):
return [self.important_data] # only this is needed
def __setstate__(self, state):
self.important_data = state[0]
self.func = lambda: 7 # just some hard-coded unpicklable function
self.is_up_to_date = False # even if it was before pickling
अब, यह किया जा सकता है:
>>> a1 = A('very important')
>>>
>>> s = pickle.dumps(a1) # calls a1.__getstate__()
>>>
>>> a2 = pickle.loads(s) # calls a1.__setstate__(['very important'])
>>> a2
<__main__.A object at 0x0000000002742470>
>>> a2.important_data
'very important'
>>> a2.func()
7
यहाँ कार्यान्वयन एक मूल्य के साथ एक सूची को प्रदर्शित करता है: [self.important_data] । यह सिर्फ एक उदाहरण था, __getstate__ कुछ भी हो सकता है जो कि लेने योग्य है, जब तक __setstate__ जानता है कि __setstate__ कैसे करना है। एक अच्छा विकल्प सभी मूल्यों का एक शब्दकोश है: {'important_data': self.important_data} ।
कंस्ट्रक्टर नहीं कहा जाता है! ध्यान दें कि पिछले उदाहरण में a2 pickle.loads A.__init__ pickle.loads बिना बुलाए pickle.loads में pickle.loads गया था, इसलिए A.__setstate__ को सब कुछ इनिशियलाइज़ करना था कि __init__ को इनिशियलाइज़ किया जाता अगर इसे कहा जाता।