2011-01-05 17 views
18

मुझे लगता है कि यह प्रश्न तकनीकी समस्या के बजाय "कोडिंग शैली" से अधिक है।पायथन क्लोज़ फाइल डिस्क्रिप्टर प्रश्न

ने कहा मैं कोड की एक पंक्ति है:

buf = open('test.txt','r').readlines() 
... 

फ़ाइल वर्णनकर्ता स्वचालित रूप से बंद करें या यह स्मृति में रहेगी होगा? यदि फ़ाइल डिस्क्रिप्टर बंद नहीं है, तो इसे बंद करने का पसंदीदा तरीका क्या है?

उत्तर

35

आप एक चर करने के लिए फ़ाइल वस्तु आवंटित हैं, तो आप स्पष्ट रूप से इसे .close()

f = open('test.txt','r') 
buf = f.readlines() 
f.close() 

वैकल्पिक रूप से का उपयोग कर बंद कर सकते हैं (और अधिक आम तौर पर पसंदीदा), आप with उपयोग कर सकते हैं कीवर्ड (अजगर 2.5 और अधिक से अधिक) Python docs में उल्लिखित:

यह withउपयोग करने के लिए अच्छा अभ्यास है फ़ाइल ऑब्जेक्ट्स से निपटने परकीवर्ड। इसका लाभ यह है कि फ़ाइल सूट खत्म होने के बाद फ़ाइल ठीक से बंद हो जाती है, भले ही अपवाद को उठाया गया हो। यह भी लिख बराबर कोशिश अंत में ब्लॉक की तुलना में काफी कम है :

>>> with open('test.txt','r') as f: 
...  buf = f.readlines() 
>>> f.closed 
True 
+1

इस मामले में "buf" एक सूची होगी - उस पर "बंद" विधि नहीं होगी। – jsbueno

+3

'with' 2.5 में उपलब्ध है, लेकिन आपको __future__ आयात से _statement' का उपयोग करके इसे आयात करने की आवश्यकता है। यह 2.6 आगे से जरूरी नहीं है। –

+0

@jsbueno मेरी गलती को पकड़ने के लिए धन्यवाद!मैंने आपके अवलोकन को प्रतिबिंबित करने के लिए उत्तर अपडेट किया! @ जे कॉनोड, जानकारी के लिए धन्यवाद! (मैं 2.4 से 2.7 तक कूद गया, इसलिए मैंने कभी अनुभव नहीं किया!) – sahhhm

5

कचरा कलेक्टर इसे बंद होने तक यह स्मृति में रहेगा। आपको हमेशा अपने फ़ाइल डिस्क्रिप्टर को स्पष्ट रूप से बंद करना चाहिए। बस कुछ इस तरह करते हैं:

with open('test.txt', 'r') as f: 
    buf = f.readlines() 
+5

कड़ाई से बोलते हुए, फ़ाइल का उपयोग बंद करने के लिए "स्पष्ट रूप से" नहीं है ... –

+0

@ ह्यूग बोथवेल: हम्म। मुझे लगता है कि यह स्पष्ट रूप से आपकी परिभाषा पर निर्भर करता है। मैं इसे स्पष्ट रूप से बंद कर दूंगा। – Falmarri

+1

यह अब तक स्पष्ट है कि अब हम जानते हैं कि फ़ाइल कब बंद हो जाएगी, लेकिन वास्तव में यह नहीं है कि मैं प्रोग्रामिंग भावना में स्पष्ट कहूंगा। –

13

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

अन्य कार्यान्वयनों में, जैसे कि ज्योथन, फ़ाइल तब तक बंद नहीं होगी जब तक कि यह गारबर्ज एकत्र नहीं किया जाता है, जो लंबे समय तक हो सकता है।

यह खराब शैली है जो कार्यान्वयन के व्यवहार के आधार पर अलग-अलग काम करता है।

यदि यह महज एक जल्दी स्क्रिप्ट या कुछ और आप दुभाषिया में कोशिश कर रहे हैं के लिए है यह काफी अच्छा है शैल, लेकिन उत्पादन के काम किसी भी प्रकार के लिए आप आमतौर पर Falmarri के जवाब में के रूप में एक संदर्भ प्रबंधक का उपयोग करना चाहिए

+0

+1 अच्छा व्यावहारिक बिंदु। – martineau

+1

विभिन्न पायथन कार्यान्वयन में कोडर को इस बिटिंग का एक उदाहरण यह था कि पीईपीई पर चलने पर मर्कुरियल ओएस द्वारा अनुमत खुली फ़ाइलों की संख्या को समाप्त कर देगा। Mercurial इसे ठीक करने के लिए परिवर्तन से गुजर रहा है। – TryPyPy

1

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

+0

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

+1

आप सही हैं, मैंने महत्वपूर्ण भाग लिखना याद किया: यह स्वयं और कभी-कभी था। क्योंकि तब, जब वह फ़ाइल हैंडल से बाहर चला जाता है, तो वह ध्यान देगा। ;) लेकिन अगर वह इसे किसी ग्राहक साइट पर रखता है। : - / –

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