2010-08-27 10 views
8

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

स्टैंडर्ड फ़ाइल आउटपुट रास्ता:

newFile = open('trialWrite1.py','w') 
newFile.write(str(firstNames)) 
newFile.write(str(midterm1Scores)) 
newFile.close() 

अचार रास्ता:

newFile = open('trialWrite2.txt','w') 
cPickle.dump(firstNames, newFile) 
cPickle.dump(midterm1Scores, newFile) 
newFile.close() 

कौन सा तकनीक बेहतर या पसंद किया जाता है मैं निम्नलिखित दो तरीकों से उत्पादन स्टोर कर सकते हैं? क्या एक दूसरे का उपयोग करने का कोई फायदा है?

धन्यवाद

उत्तर

3

pickle अधिक सामान्य है - यह आप बाद में उपयोग के लिए एक फाइल करने के लिए वस्तुओं के कई अलग अलग प्रकार डंप करने के लिए अनुमति देता है। नकारात्मकता यह है कि अंतरिम भंडारण बहुत मानव-पठनीय नहीं है, न कि मानक प्रारूप में।

दूसरी ओर, फाइल को स्ट्रिंग्स लिखना, अन्य गतिविधियों या कोड के लिए एक बेहतर इंटरफ़ेस है। लेकिन पाठ को फिर से आपके पायथन ऑब्जेक्ट में पार्स करने की लागत पर आता है।

दोनों इस सरल (सूची?) डेटा के लिए ठीक हैं; मैं write(firstNames) का उपयोग केवल इसलिए करूंगा क्योंकि अचार का उपयोग करने की कोई आवश्यकता नहीं है। आम तौर पर, फाइल सिस्टम पर अपना डेटा कैसे बनाए रखना डेटा पर निर्भर करता है!


उदाहरण के लिए, pickle खुशी से अचार काम करता है, जो आप बस स्ट्रिंग अभ्यावेदन लिख कर ऐसा नहीं कर सकते हो जाएगा।

>>> data = range 
<class 'range'> 
>>> pickle.dump(data, foo) 
# stuff 
>>> pickle.load(open(..., "rb")) 
<class 'range'. 
+4

'पिकले 'वास्तव में फ़ंक्शंस फ़ंक्शंस और क्लास नहीं लेता है जैसा कि आप मान सकते हैं - (http://docs.python.org/library/pickle.html#what-can-be-pickled-and-unpickled)" नोट कि फ़ंक्शंस (अंतर्निहित और उपयोगकर्ता परिभाषित) को "पूरी तरह से योग्य" नाम संदर्भ द्वारा चुना जाता है, मूल्य से नहीं ... "इस मामले में दृढ़ता स्थिर मॉड्यूल पदानुक्रमों और इंटरफेस पर निर्भर करती है क्योंकि अनपॅकिंग वातावरण को पिकलिंग पर्यावरण से मेल खाना चाहिए। –

+0

उत्तर के लिए धन्यवाद। डेविड ने सुझाव दिया है कि मैं या तो स्ट्रिंग प्रस्तुति लिखूंगा या सीएसवी का उपयोग करूंगा। – Curious2learn

+0

@ जेरेमी: मुझे नहीं पता था कि 'अचार' को उपयोगकर्ता परिभाषित कार्यों को पसंद नहीं आया - धन्यवाद! – katrielalex

4

मुझे लगता है कि csv मॉड्यूल यहाँ एक अच्छा फिट हो सकता है, के बाद से सीएसवी एक मानक प्रारूप दोनों पढ़ सकते हैं और अजगर (और कई अन्य भाषाओं) द्वारा लिखित किया जा सकता है, और यह भी मानव पठनीय है। प्रयोग किया जा सकता है के रूप में सरल रूप में

with open('trialWrite1.py','wb') as fileobj: 
    newFile = csv.writer(fileobj) 
    newFile.writerow(firstNames) 
    newFile.writerow(midterm1Scores) 

हालांकि, यह शायद और अधिक समझ बनाने चाहते हैं प्रति पंक्ति एक छात्र, उनके नाम और स्कोर सहित लिखने के लिए। यही कारण है कि इस तरह से किया जा सकता है:

from itertools import izip 
with open('trialWrite1.py','wb') as fileobj: 
    newFile = csv.writer(fileobj) 
    for row in izip(firstNames, midterm1Scores): 
     newFile.writerow(row) 
+0

मुझे लगता है कि 'लेखको' उम्मीद करता है कि एक tuple एक कड़े संग्रह नहीं है। – katrielalex

+1

प्रलेखन के अनुसार, यह सूचियों या tuples सहित किसी भी अनुक्रम ले जाएगा। –

+0

यदि मैं 'newFile.close()' पंक्ति का उपयोग करता हूं, तो मुझे यह कहते हुए एक त्रुटि मिलती है कि "'_csv.writer' ऑब्जेक्ट में कोई विशेषता नहीं है 'बंद करें' ' – Curious2learn

0

एक पूरी तरह से अलग दृष्टिकोण के लिए, कि Python ships with SQLite पर विचार करें। आप किसी भी तृतीय पक्ष निर्भरताओं को जोड़ने के बिना अपने डेटा को SQL डेटाबेस में संग्रहीत कर सकते हैं।

+0

मुझे matplotlib के साथ ग्राफ़ प्लॉट करने के लिए डेटा का उपयोग करने की आवश्यकता है। मैं एसक्यूलाइट से आयात कर सकता हूं लेकिन यह निर्यात और आयात करने के लिए बहुत अधिक काम करता है। – Curious2learn