2011-07-04 13 views
54

मुझे एक दर्जन ऑब्जेक्ट्स को फ़ाइल में सहेजने की आवश्यकता है और फिर उन्हें बाद में पुनर्स्थापित करें। मैंने अचार और शेल्फ के साथ लूप के लिए उपयोग करने का प्रयास किया है लेकिन यह सही काम नहीं करता है।मैं पाइथन में एकाधिक चर को कैसे सहेज और पुनर्स्थापित कर सकता हूं?

संपादित करें।
वस्तुओं है कि मैं को बचाने के लिए एक ही कक्षा में थे कोशिश कर रहा था सब के सब (मैं इस उल्लेख किया जाना चाहिए था से पहले), और मुझे नहीं पता था कि मैं सिर्फ इस तरह पूरी कक्षा को बचा सकता है:

def saveLoad(opt): 
    global calc 
    if opt == "save": 
     f = file(filename, 'wb') 
     pickle.dump(calc, f, 2) 
     f.close 
     print 'data saved' 
    elif opt == "load": 
     f = file(filename, 'rb') 
     calc = pickle.load(f) 
    else: 
     print 'Invalid saveLoad option' 
+1

एक नमूना कोड – Yossi

+1

पोस्ट करें आप कहते हैं कि आप पाश के लिए एक कोशिश की है। कृपया उस कोड को पोस्ट करें, और क्यों "यह सही काम नहीं करता" (यानी, क्या हुआ और आप क्या करना चाहते थे)। – Blair

+0

यदि आप विंडोज़ पर हैं, तो बाइनरी मोड –

उत्तर

9

आपको shelve और pickle मॉड्यूल देखना चाहिए। यदि आपको बहुत अधिक डेटा स्टोर करने की आवश्यकता है तो डेटाबेस

27

का उपयोग करना बेहतर हो सकता है pickle नामक एक अंतर्निहित लाइब्रेरी है। pickle का उपयोग करके आप वस्तुओं को एक फ़ाइल में डंप कर सकते हैं और बाद में लोड कर सकते हैं।

import pickle 

f = open('store.pckl', 'wb') 
pickle.dump(obj, f) 
f.close() 

f = open('store.pckl', 'rb') 
obj = pickle.load(f) 
f.close() 
+1

समय पाइथन 3.4 का उपयोग करता हूं, तो मैं कुछ उदाहरण पोस्ट करूंगा, जब मैं लिखने के लिए फ़ाइल खोलने के लिए 'f = open (' store.pckl ',' wb ') 'f = open (' store.pckl ',' wb ') का उपयोग करता हूं। Http://stackoverflow.com/questions/13906623/using-pickle-dump-typeerror-must-be-str-not-bytes का संदर्भ लें और खोलने के लिए 'f = open (' store.pckl ',' rb ') का उपयोग करें से पढ़ने के लिए एक फ़ाइल। Http://stackoverflow.com/questions/7031699/typeerror-str-does-not-support-the-buffer-interface का संदर्भ लें। – user3731622

+0

यह 3.4+ के लिए विशिष्ट है? मैंने लगभग जवाब नीचे मतदान किया क्योंकि जब आप 'बी' का उपयोग नहीं करते हैं तो यह त्रुटियों को उत्पन्न करता है। –

93

आप एक से अधिक ऑब्जेक्ट को बचाने के लिए की जरूरत है, तो आप बस उन्हें एक ही सूची, या टपल में, रख सकते हैं, उदाहरण के लिए:

import pickle 

# obj0, obj1, obj2 are created here... 

# Saving the objects: 
with open('objs.pkl', 'w') as f: # Python 3: open(..., 'wb') 
    pickle.dump([obj0, obj1, obj2], f) 

# Getting back the objects: 
with open('objs.pkl') as f: # Python 3: open(..., 'rb') 
    obj0, obj1, obj2 = pickle.load(f) 

आप डेटा का एक बहुत है, तो आप कम कर सकते हैं protocol=-1 से dump() पास करके फ़ाइल का आकार; pickle फिर डिफ़ॉल्ट ऐतिहासिक (और अधिक पिछड़ा-संगत) प्रोटोकॉल के बजाय सर्वोत्तम उपलब्ध प्रोटोकॉल का उपयोग करेगा। इस मामले में, फ़ाइल क्रमशः बाइनरी मोड (wb और rb) में खोली जानी चाहिए।

बाइनरी मोड का उपयोग पायथन 3 के साथ भी किया जाना चाहिए, क्योंकि इसका डिफ़ॉल्ट प्रोटोकॉल बाइनरी (यानी गैर-पाठ) डेटा (लेखन मोड 'wb' और रीडिंग मोड 'rb') उत्पन्न करता है।

+4

पायथन 3.5 में, मुझे फ़ाइल को "बाइट" मोड में खोलना पड़ा, उदा। 'ओपन (' objs.pickle ',' wb ') के साथ f: '(' wb' नोट करें)। – kbrose

+1

अच्छा बिंदु। मैंने इसे जवाब में जोड़ा। – EOL

2

आप klepto का उपयोग कर सकते हैं, जो स्मृति, डिस्क या डेटाबेस को लगातार कैशिंग प्रदान करता है।

[email protected]>$ python 
Python 2.7.6 (default, Nov 12 2013, 13:26:39) 
[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 klepto.archives import file_archive 
>>> db = file_archive('foo.txt') 
>>> db['1'] = 1 
>>> db['max'] = max 
>>> squared = lambda x: x**2 
>>> db['squared'] = squared 
>>> def add(x,y): 
... return x+y 
... 
>>> db['add'] = add 
>>> class Foo(object): 
... y = 1 
... def bar(self, x): 
...  return self.y + x 
... 
>>> db['Foo'] = Foo 
>>> f = Foo() 
>>> db['f'] = f 
>>> db.dump() 
>>> 

फिर, दुभाषिया पुनः प्रारंभ करने पर ...

[email protected]>$ python 
Python 2.7.6 (default, Nov 12 2013, 13:26:39) 
[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 klepto.archives import file_archive 
>>> db = file_archive('foo.txt') 
>>> db 
file_archive('foo.txt', {}, cached=True) 
>>> db.load() 
>>> db 
file_archive('foo.txt', {'1': 1, 'add': <function add at 0x10610a0c8>, 'f': <__main__.Foo object at 0x10510ced0>, 'max': <built-in function max>, 'Foo': <class '__main__.Foo'>, 'squared': <function <lambda> at 0x10610a1b8>}, cached=True) 
>>> db['add'](2,3) 
5 
>>> db['squared'](3) 
9 
>>> db['f'].bar(4) 
5 
>>> 

कोड यहाँ प्राप्त करें: https://github.com/uqfoundation

+0

यह अंतर्निहित नहीं है ... – Zizouz212

+5

ओपी ने अंतर्निहित के लिए नहीं पूछा था। –

संबंधित मुद्दे

 संबंधित मुद्दे