2010-07-09 5 views
39

मैं एक टैब सीमांकित फ़ाइल पढ़ने के लिए सीएसवी मॉड्यूल का उपयोग कर रहा हूं। नीचे दिए गए कोड:पायथन: कोई csv.close()?

z = csv.reader(open('/home/rv/ncbi-blast-2.2.23+/db/output.blast'), delimiter='\t') 

लेकिन जब मैं Z.close() मेरी स्क्रिप्ट के अंत में जोड़ें मैं हो और त्रुटि बताते हुए

z.close() 

तो "csv.reader पास '' वस्तु कोई गुण नहीं है '" मैं "जेड" कैसे बंद करूं?

उत्तर

40

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

आपको अंतर्निहित file ऑब्जेक्ट को बंद करना सुनिश्चित करना चाहिए, हालांकि।

with open('/home/rv/ncbi-blast-2.2.23+/db/output.blast') as f: 
    z = csv.reader(f, delimiter='\t') 

आप with statement से परिचित नहीं हैं, तो यह मूल रूप से इसकी सामग्री एक try...finally ब्लॉक कि finally भाग में फ़ाइल बंद कर देता है में encloses: अजगर 2.5+ में, यहाँ तरीका है कि ऐसा करने के लिए है। पायथन 2.5 के लिए आपको with कथन सक्षम करने के लिए __future__ आयात की आवश्यकता होगी। यदि आपको 2.4 जैसे पायथन के पुराने संस्करणों के साथ संगतता बरकरार रखने की आवश्यकता है, तो आपको try...finally का उपयोग करके स्वयं को बंद करना चाहिए। with बयान के साथ संगतता के मुद्दों उनका कहना है के लिए Jared को


धन्यवाद।

27

आप सीएसवी पाठकों को सीधे बंद नहीं करते हैं; इसके बजाय आपको जो भी फाइल-जैसी ऑब्जेक्ट का उपयोग किया जा रहा है उसे बंद करना चाहिए। उदाहरण के लिए, आपके मामले में, आप कहेंगे:

f = open('/home/rv/ncbi-blast-2.2.23+/db/output.blast') 
z = csv.reader(f, delimiter='\t') 
... 
f.close() 

आप अजगर का नवीनतम संस्करण का उपयोग कर रहे हैं, तो आप बयान, उदा उपयोग कर सकते हैं

with open('/home/rv/ncbi-blast-2.2.23+/db/output.blast') as f: 
    z = csv.reader(f, delimiter='\t') 
    ... 

यह लाभ यह है कि f बंद कर दिया जाएगा, भले ही आप एक अपवाद फेंक या अन्यथा के साथ-ब्लॉक, जबकि इस तरह के मामले के अंदर लौट पिछले उदाहरण में खुला शेष फाइल करने के लिए नेतृत्व करेंगे है। दूसरे शब्दों में, यह मूल रूप से एक कोशिश/आखिरकार ब्लॉक के बराबर है, उदा।

f = open('/home/rv/ncbi-blast-2.2.23+/db/output.blast') 
try: 
    z = csv.reader(f, delimiter='\t') 
    ... 
finally: 
    f.close() 
3

आप reader() विधि का परिणाम बंद नहीं करते हैं, तो आप open() विधि का परिणाम बंद कर देते हैं। तो, दो कथन का प्रयोग करें: foo=open(...); bar=csv.reader(foo)। फिर आप foo.close() पर कॉल कर सकते हैं।

एक पंक्ति में ऐसा करने के लिए कोई बोनस अंक नहीं दिया गया है जो दो में अधिक पठनीय और कार्यात्मक हो सकता है।

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