2013-03-17 11 views
16

मुझे एक विधि मिली है जो एक फ़ाइल में कई मसालेदार वस्तुओं (tuples, वास्तव में) डंप करता है।अचार - एक फ़ाइल में 1 से अधिक ऑब्जेक्ट डालना?

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

myob = cpickle.load(g1.readlines()[2]) 

कोशिश जहां G1 फ़ाइल है, मैं एक EOF त्रुटि क्योंकि मेरे मसालेदार वस्तु एक पंक्ति से अधिक लंबी है मिलता है। क्या सिर्फ मेरी मसालेदार वस्तु पाने का कोई तरीका है?

+0

ऐसा क्यों है उन सभी को एक सूची में डालने के लिए एक समस्या है? –

उत्तर

1

फ़ाइल की लाइनों के रूप में उन्हें वापस पढ़ने की कोशिश न करें, बस pickle.load() अपनी इच्छित वस्तुओं की संख्या। ऐसा करने के उदाहरण के लिए How to save an object in Python प्रश्न का मेरा उत्तर देखें।

51

यदि आप सीधे फ़ाइल में सीधे हैंडल पास करते हैं तो आप परिणाम प्राप्त कर सकते हैं।

import pickle 

# write a file 
f = open("example", "w") 
pickle.dump(["hello", "world"], f) 
pickle.dump([2, 3], f) 
f.close() 

f = open("example", "r") 
value1 = pickle.load(f) 
value2 = pickle.load(f) 
f.close() 

pickle.dump फ़ाइल के अंत में संलग्न कर देगा, ताकि आप इसे कई बार फोन से अधिक मान लिखने के लिए कर सकते हैं।

pickle.load फ़ाइल से केवल अगले ऑब्जेक्ट की शुरुआत में फ़ाइलहेडल खोलने और इंगित करने के लिए फ़ाइल को केवल पहले मान प्राप्त करने के लिए पर्याप्त पढ़ा जाएगा। दूसरी कॉल फिर दूसरी ऑब्जेक्ट को पढ़ेगी, और फाइल के अंत में फ़ाइल पॉइंटर छोड़ देंगी। एक तीसरी कॉल EOFError के साथ विफल होने के साथ विफल हो जाएगी।

हालांकि मैंने अपने उदाहरण में सादे पुराने pickle का उपयोग किया, यह तकनीक cPickle के साथ ही काम करती है।

+0

इस उत्तर से कई अचार पढ़ने के लिए भी जवाब देखें। [पाइथन अचार फ़ाइल में एकाधिक ऑब्जेक्ट्स को सहेजना और लोड करना] (http://stackoverflow.com/questions/20716812/saving-and-loading-multiple-objects-in-python-pickle-file) – salomonvh

+0

क्या यह सीपीकल के साथ भी काम करता है? (स्पष्ट रूप से नहीं ...) – DreamFlasher

13

मुझे लगता है कि आपके डेटा को स्टोर करने से पहले एक ही ऑब्जेक्ट में पैक करना सबसे अच्छा तरीका है, और इसे लोड करने के बाद इसे अनपैक करें। यहाँ एक उदाहरण कंटेनर (you can use dict also) के रूप में एक टपल उपयोग कर रहा है :

a = [1,2] 
b = [3,4] 

with open("tmp.pickle", "wb") as f: 
    pickle.dump((a,b), f) 

with open("tmp.pickle", "rb") as f: 
    a,b = pickle.load(f) 
+1

ओप ने विशेष रूप से कहा 'मैं सभी वस्तुओं को एक सूची में नहीं रखना चाहता हूं।' वह उन्हें अनुक्रमिक रूप से लिखना चाहता है। –

+0

@ निक: यह सच हो सकता है, हालांकि ओपी ने यह नहीं कहा कि वे उन्हें 'tuple' में नहीं रखना चाहते थे। – martineau

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