मैं अचार को बचाने के लिए अचार का उपयोग कैसे कर सकता हूं?


370

मैंने उस जानकारी को देखा है जो पायथन डॉक्स देती है, लेकिन मैं अभी भी थोड़ा भ्रमित हूं। क्या कोई सैंपल कोड पोस्ट कर सकता है जो एक नई फ़ाइल लिखेगा और उसमें एक शब्दकोश को डंप करने के लिए अचार का उपयोग करेगा?


5
इसके माध्यम से पढ़ें: doughellmann.com/PyMOTW/pickle और वापस आएं जब आपको एक विशिष्ट प्रश्न की आवश्यकता हो
pyfunc

2
-1 पिछली टिप्पणियाँ देखें। कोशिश करो। फिर, अगर यह काम नहीं किया (यह हमेशा नहीं होगा), एक निर्देशित प्रश्न तैयार किया जा सकता है (एक परिकल्पना या दो के साथ जो परीक्षण किया जा सकता है, और "के लिए क्वियर", संभवतः अन्य लोगों से सवाल पूछने से पहले)। उदाहरण वाक्य रचना त्रुटि थी? एक अपवाद? क्या मूल्य वापस आ गए हैं?

1
मैं pygame से जानकारी को बचाने के लिए इसका उपयोग करने की कोशिश कर रहा हूं। मैंने उपरोक्त जानकारी का उपयोग किया है और मेरा कोड इस तरह दिखता है:
चाचमू

name = raw_input ('इनपुट फ़ाइल का नाम:') tf = खुला (नाम + '। pkl', 'wb') pickle.dump (कुल, tf) tf.close ()
Chachmu

2
आपको एक नया सवाल पूछना चाहिए कि सतह की वस्तुओं को कैसे अचार करना है
जॉन ला रोय

जवाबों:


727

इसे इस्तेमाल करे:

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

4
@houbysoft: आपने क्यों हटाया pickle.HIGHEST_PROTOCOL?
ब्लेंडर

37
@ ब्लेंडर: सवाल के इस स्तर के लिए अप्रासंगिक और अनावश्यक रूप से जटिल - औसत उपयोगकर्ता चूक के साथ ठीक हो जाएगा।
houbysoft

28
@houbysoft: पायथन 3 उपयोगकर्ताओं के लिए सही है, लेकिन पायथन 2 पर, डिफ़ॉल्ट प्रोटोकॉल (0) का उपयोग करके समय और स्थान पर न केवल अविश्वसनीय रूप से अक्षम है, लेकिन यह वास्तव में कई चीजों को संभाल नहीं सकता है जो प्रोटोकॉल 2+ को ठीक से संभालता है (जैसे नया -स्टाइल कक्षाएं जो उपयोग करती हैं __slots__)। मैं यह नहीं कह रहा हूं कि आपको हमेशा उपयोग करना चाहिए HIGHEST_PROTOCOL, लेकिन यह सुनिश्चित करना कि आप प्रोटोकॉल 0 या 1 का उपयोग नहीं करते हैं, वास्तव में महत्वपूर्ण है।
शैडो रेंजर

11
pickle.HIGHEST_PROTOCOLवास्तव में क्या करता है?
बॉलपॉइंटबैन

7
@ बॉलपॉइंटबैन: यह पायथन सपोर्ट के आपके संस्करण के उच्चतम प्रोटोकॉल संस्करण को चुनता है: docs.python.org/3/library/pickle.html#data-stream-format
Blender

92
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')

वैकल्पिक प्रारूप

आपके आवेदन के लिए, निम्नलिखित महत्वपूर्ण हो सकता है:

  • अन्य प्रोग्रामिंग भाषाओं द्वारा सहायता
  • पठन / लेखन प्रदर्शन
  • कॉम्पैक्टनेस (फ़ाइल आकार)

यह भी देखें: डेटा क्रमांकन प्रारूपों की तुलना

यदि आप विन्यास फाइल बनाने के लिए रास्ता ढूंढ रहे हैं, तो आप पायथन में मेरी संक्षिप्त लेख विन्यास फाइल पढ़ना चाहते हैं


1
मुझे लगता है कि 2GB की सीमा प्रोटोकॉल = 4 और उच्चतर के साथ हटा दी गई थी।
कंप्यूटर

28
# 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
क्या खुले के बाद () का उपयोग बंद करना आवश्यक है?
PlsWork

1
हाँ, सामान्य तौर पर। हालाँकि, CPython (आपके पास संभवतः जो डिफ़ॉल्ट अजगर है) फ़ाइल ऑब्जेक्ट के समाप्त होने पर (जब कुछ भी इसे संदर्भित नहीं करता है) फ़ाइल स्वचालित रूप से बंद हो जाती है। इस मामले में चूँकि कुछ भी फ़ाइल ऑब्जेक्ट को खुले () से वापस किए जाने के बाद संदर्भित नहीं करता है, इसे लोड रिटर्न के रूप में जल्द ही बंद कर दिया जाएगा। यह अच्छा अभ्यास नहीं माना जाता है और अन्य प्रणालियों पर समस्या पैदा करेगा
अंकुर एस

14

सामान्य तौर पर, वसीयतनामा चुनना 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)।


9
>>> 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.

6

यदि आप केवल एक ही फ़ाइल में हुक को स्टोर करना चाहते हैं 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 और उन्हें फिर से लोड करता है।

देखें प्रलेखन किसी भी अधिक जानकारी के लिए।




-8

मैंने अचार को भ्रामक पाया है (संभवतः इसलिए कि मैं मोटा हूं)। मैंने पाया कि यह काम करता है, हालांकि:

myDictionaryString=str(myDictionary)

जिसे आप फिर एक टेक्स्ट फाइल पर लिख सकते हैं। मैंने अचार का उपयोग करने की कोशिश करना छोड़ दिया क्योंकि मुझे एक .dat फ़ाइल में पूर्णांक लिखने के लिए त्रुटियां हो रही थीं। मैं अचार का उपयोग नहीं करने के लिए माफी माँगता हूँ।


1
-1: इसे सहेजना चाहिए जैसा कि यह है (यानी, एक अजगर ऑब्जेक्ट) ताकि हम इसे बाद में घंटों तक पढ़ सकें फिर से इसे चलाने के लिए इंतजार कर रहे हैं। अचार हमें बाद में पढ़ने के लिए एक अजगर वस्तु को स्टोर करने की अनुमति देता है।
4

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

1
@ Ti7 के बिंदु में जोड़ने के लिए, उत्तर की तकनीकी योग्यता की परवाह किए बिना, यह पोस्ट वीएलक्यू नहीं है। किसी को लगता है कि इस सवाल का जवाब गलत है, वे downvote चाहिए और / या टिप्पणी का कारण बताते हुए, नहीं VLQ के रूप में यह फ़्लैग करें।
EJoshuaS - मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.