2012-03-22 9 views
16

मैं बहुत सारे पायथन कोड लिखता हूं जहां मैं सिर्फ एक चर को एक फ़ाइल पढ़ना चाहता हूं। मुझे पता है कि ये दो अनुशंसित तरीके हैं -खुला है()। पढ़ें() सुरक्षित?

with open('file') as f: 
    data = f.read() 

# or 

fo = open('file') 
data = f.read() 
fo.close() 

मेरे प्रश्न, इस के डाउनसाइड्स क्या हैं?

data = open('file').read() 
+1

क्या आपका मतलब है "फाइल को स्पष्ट रूप से बंद नहीं करने के डाउनसाइड्स क्या हैं?" –

+0

@ विल, सॉर्टा। मेरा सवाल कोड के विशिष्ट टुकड़े के बारे में है। आपको लगता है कि मुझे शीर्षक बदलना चाहिए? – FakeRainBrigand

+5

ध्यान दें कि '' with'' विकल्प इस तथ्य के कारण बेहतर है क्योंकि यह अपवादों को सही तरीके से संभालता है। –

उत्तर

19

data = open('file').read() 

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

विशिष्ट शब्दों में, सीपीथॉन (सामान्य पायथन कार्यान्वयन) संदर्भित गणना की गई वस्तुओं का उपयोग करता है, इसलिए फ़ाइल लगभग निश्चित रूप से बंद हो जाती है तुरंत हो जाएगी। हालांकि, यह अन्य कार्यान्वयन जैसे आयरनपीथन या ज्योथन के लिए जरूरी नहीं है।

+0

स्पष्टीकरण के लिए धन्यवाद :) – FakeRainBrigand

5

नकारात्मकता यह है कि दोनों के बाद, पहला और दूसरा ब्लॉक आप सुनिश्चित कर सकते हैं कि आपकी फ़ाइल बंद है। (पहले उदाहरण में भी एक अपवाद उठाया गया था।)

संक्षिप्त रूप आपको ऐसी कोई गारंटी नहीं देता है।

2

an answersimiliar question (इस बार, लिखने से संबंधित) में, मुख्य नकारात्मकता यह है कि उस फ़ाइल को बंद होने पर आपका कोई नियंत्रण नहीं है। समस्या लिखने के लिए अधिक महत्वपूर्ण है (चूंकि आप फ़ाइल को बदल रहे हैं), लेकिन इसका अभी भी मतलब है कि जब तक ऑब्जेक्ट को कचरा कलेक्टर द्वारा पुनः प्राप्त नहीं किया जाता है तब तक आपके पास एक अनजान फ़ाइल हैंडल होता है।

कई पीढ़ी के जीसीएस इस प्रकार की वस्तुओं को स्पष्ट करेंगे (दायरे के अंत में इसके लिए कोई शेष संदर्भ नहीं है), लेकिन इसकी गारंटी नहीं दी जा सकती है। तो, यह सुनिश्चित करने के लिए स्पष्ट फ़ाइल बंद करने के लिए बेहतर है।

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