पायथन क्रमांकन - अचार क्यों?


87

मैं समझ गया कि पायथन पिकिंग एक तरह से पायथन ऑब्जेक्ट को 'स्टोर' करने का एक तरीका है जो ऑब्जेक्ट प्रोग्रामिंग का सम्मान करता है - txt फ़ाइल या DB में लिखे गए आउटपुट से अलग।

क्या आपके पास निम्नलिखित बिंदुओं पर अधिक विवरण या संदर्भ हैं:

  • मसालेदार वस्तुएं 'संग्रहीत' कहां हैं?
  • डीबी में भंडारण से ज्यादा वस्तु प्रतिनिधित्व को क्यों संरक्षित किया जाता है?
  • क्या मैं एक पायथन शेल सत्र से दूसरे में मसालेदार वस्तुओं को पुनः प्राप्त कर सकता हूं?
  • क्या आपके पास महत्वपूर्ण उदाहरण हैं जब क्रमांकन उपयोगी है?
  • अचार के साथ क्रमबद्धता डेटा 'संपीड़न' के साथ करता है?

दूसरे शब्दों में, मैं अचार पर एक डॉक्टर की तलाश कर रहा हूं - Python.doc बताते हैं कि कैसे अचार को लागू करना है, लेकिन लगता है कि यह क्रमांकन और उपयोग की आवश्यकता के बारे में विवरण में नहीं है।


बाद की बहाली के लिए राज्य को बचाने के लिए या एक अलग अजगर क्रम के लिए एक वस्तु को साझा / कॉपी करने के लिए मेरा अनुमान होगा।
सिंथेसाइजरपटेल

13
आपके कई प्रश्नों के उत्तर विकिपीडिया के धारावाहिकीकरण के लेख द्वारा दिए गए हैं: en.wikipedia.org/wiki/Serialization
NPE

5
क्या आप पूछ रहे हैं कि मुझे पायथन में क्रमांकन के लिए अचार की आवश्यकता क्यों होगी? या बल्कि (आखिर) क्रमांकन का उद्देश्य क्या है?
मूओइप

शायद अचार के साथ सुरक्षा के मुद्दों का उल्लेख करना अच्छा है। उदाहरण डॉक्स में पाए जा सकते हैं , और कई एसओ प्रश्नों में, जैसे यह
djvg

जवाबों:


99

अचार बनाना एक अजगर वस्तु (सूची, तानाशाह, आदि) को एक चरित्र धारा में बदलने का एक तरीका है। विचार यह है कि इस चरित्र धारा में किसी अन्य अजगर लिपि में वस्तु के पुनर्निर्माण के लिए आवश्यक सभी जानकारी शामिल है।

जहां तक ​​संग्रहित जानकारी संग्रहीत की जाती है, आमतौर पर कोई भी ऐसा करेगा:

with open('filename', 'wb') as f:
    var = {1 : 'a' , 2 : 'b'}
    pickle.dump(var, f)

यह var'फ़ाइलनाम' फ़ाइल में हमारे डिक्टेड के अचार वाले संस्करण को संग्रहीत करेगा । फिर, किसी अन्य स्क्रिप्ट में, आप इस फ़ाइल से एक चर में लोड कर सकते हैं और शब्दकोश को फिर से बनाया जाएगा:

with open('filename','rb') as f:
    var = pickle.load(f)

अचार बनाने का एक अन्य उपयोग यह है कि यदि आपको इस शब्दकोश को एक नेटवर्क (शायद सॉकेट या कुछ और के साथ) पर प्रेषित करने की आवश्यकता है। आपको पहले इसे एक चरित्र स्ट्रीम में बदलने की आवश्यकता है, फिर आप इसे सॉकेट कनेक्शन पर भेज सकते हैं।

इसके अलावा, यहां बोलने के लिए कोई "संपीड़न" नहीं है ... यह सिर्फ एक प्रतिनिधित्व (रैम) से दूसरे ("पाठ" में) में बदलने का एक तरीका है।

About.com में यहां अचार डालने का अच्छा परिचय है


2
आम तौर पर एक होताwith open('filename') as f: ...
moooeeeep

3
इसके अलावा, आपको करने की आवश्यकता होगी with open(filename, 'wb') as f: ...या आप फ़ाइल में नहीं लिख पाएंगे।
टिम पीटरज़

धन्यवाद!! पायथन दृढ़ता प्रबंधन पर यह एक अच्छा है, यहाँ
kiriloff

1
सामान्य तौर pickleपर एक नेटवर्क पर एक शब्दकोश को प्रसारित करने के लिए उपयोग करना बहुत अच्छा विचार नहीं है (json यहां बेहतर हो सकता है)। हालांकि दुर्लभ मामलों में यह उपयोगी हो सकता है जैसे, multiprocessingमॉड्यूल।
JFS

@Tim Pietzcker: protocol=0(Python2.x पर डिफ़ॉल्ट) का उपयोग टेक्स्ट मोड में खोली गई फ़ाइलों के साथ किया जा सकता है।
JFS

36

वितरित और समानांतर कंप्यूटिंग के लिए अचार पूरी तरह से आवश्यक है।

कहते हैं कि आप समानांतर नक्शा कम करना चाहते थे multiprocessing(या पाइना के साथ क्लस्टर नोड्स में ), तो आपको यह सुनिश्चित करने की ज़रूरत है कि आप जिस समानांतर संसाधन में मैप करना चाहते हैं वह अचार करेगा। यदि यह अचार नहीं करता है, तो आप इसे किसी अन्य प्रक्रिया, कंप्यूटर, आदि पर अन्य संसाधनों के लिए नहीं भेज सकते हैं । यहां एक अच्छे उदाहरण के लिए भी देखें ।

ऐसा करने के लिए, मैं डिल का उपयोग करता हूं , जो कि अजगर में लगभग किसी भी चीज को सीरियल कर सकता है। डिल में आपके पास कुछ अच्छे उपकरण हैं जो आपको यह समझने में मदद करते हैं कि जब आपका कोड विफल हो जाता है, तो क्या आपके अचार को विफल कर रहा है।

और, हाँ, लोग किसी गणना की स्थिति, या आपके ipython सत्र, या जो कुछ भी हो, उसे सहेजने के लिए उपयोग करते हैं । आप अचार के पिकर और अनपिकलर को अपने साथ bz2या gzipयदि आप चाहें, तो संपीड़न करने के लिए विस्तारित कर सकते हैं।


0

मुझे यह बड़े और जटिल कस्टम वर्गों के साथ विशेष रूप से उपयोगी लगता है। एक विशेष उदाहरण में, मैं सोच रहा हूँ कि "डेटाबेस इकट्ठा करना" (डेटाबेस से) जानकारी बनाने के लिए कक्षा पहले से ही आधी लड़ाई थी। फिर कक्षा में संग्रहीत जानकारी को उपयोगकर्ता द्वारा रनटाइम में बदल दिया जा सकता है।

आपके पास डेटाबेस में तालिकाओं का एक और समूह हो सकता है और संग्रहित हर चीज के माध्यम से जाने और नए डेटाबेस तालिकाओं में लिखने के लिए एक और फ़ंक्शन लिख सकता है। फिर आपको एक अन्य फ़ंक्शन लिखने की आवश्यकता होगी जो उस जानकारी को वापस पढ़ने के द्वारा सहेजे गए कुछ को लोड करने में सक्षम हो।

वैकल्पिक रूप से, आप पूरी कक्षा को अचार कर सकते हैं और फिर डेटाबेस में किसी एक क्षेत्र में संग्रहीत कर सकते हैं। फिर जब आप इसे वापस लोड करने के लिए जाते हैं, तो यह पहले की तरह ही वापस लोड हो जाएगा। यह जटिल कक्षाओं को बचाने और पुनर्प्राप्त करने पर बहुत समय और कोड की बचत कर सकता है।


-1

यह एक तरह से क्रमबद्धता है। cPickle का उपयोग करें यह अचार की तुलना में बहुत तेज है।

import pickle
##make Pickle File
with open('pickles/corups.pickle', 'wb') as handle:
    pickle.dump(corpus, handle)

#read pickle file
with open('pickles/corups.pickle', 'rb') as handle:
    corpus = pickle.load(handle)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.