2010-03-08 13 views
19

यदि मैं निम्न करता हूं, तो क्या पाइंडन स्वचालित रूप से बंद हो जाता है क्योंकि यह पाइथन में गुंजाइश से बाहर हो जाता है:क्या स्कोप से बाहर होने के बाद पाइथन में स्वचालित रूप से बंद हो जाता है?

def read_contents(file_path): 
    return file(file_path).read() 

यदि ऐसा नहीं होता है, तो मैं इस कार्य को स्वचालित रूप से दायरे को बंद करने के लिए कैसे लिख सकता हूं?

उत्तर

17

यह फाइल की __del__ बयान में फ़ाइल हैंडल बंद हो जाना चाहिए, लेकिन एक बेहतर दृष्टिकोण एक with ब्लॉक का उपयोग करने के होगा:

def read_contents(file_path): 
    with open(file_path, 'r') as f: 
    return f.read() 

अधिक जानकारी के लिए http://docs.python.org/library/stdtypes.html#file.close देखें।

+0

बस उल्लेख करने के लिए: फ़ाइल एक फ़ाइल ऑब्जेक्ट देता है जिसमें एक करीबी विधि है। यह सबसे सीधा आगे समाधान होगा, लेकिन "साथ" स्पष्ट रूप से अच्छा है। – Achim

+0

मुझे कोई समस्या है - मेरे पास पाइथन में 'साथ' नहीं है। क्या भविष्य से आयात करना ठीक है? मेरे पास पाइथन 2.5 है। – bodacydo

+0

यदि आपके पास पाइथन 2.5 है, तो हाँ। –

28

FogleBird के उत्तर पर विस्तार करने के लिए, यदि आप इसे स्पष्ट रूप से बंद नहीं करते हैं तो फ़ाइल ऑब्जेक्ट नष्ट होने पर फ़ाइल स्वचालित रूप से बंद हो जाएगी। सीपीथॉन में यह जल्द ही होगा जैसे कि इसके कोई और संदर्भ नहीं हैं, उदा। यदि यह एक फ़ंक्शन में स्थानीय चर है और फ़ंक्शन समाप्त होता है। हालांकि अगर फ़ंक्शन में कोई अपवाद फेंक दिया गया है और फ़ाइल को with कथन या try:...finally: का उपयोग करके स्पष्ट रूप से बंद नहीं किया गया है तो फ़ाइल का संदर्भ ट्रेसबैक ऑब्जेक्ट में स्टैक ट्रेस के हिस्से के रूप में रखा जाएगा और फ़ाइल बंद नहीं होगी कम से कम अगले अपवाद फेंक दिया जाता है।

इसके अलावा आयरनपीथन और जैथन क्रमशः नेट सीएलआर और जावा जेवीएम की कचरा संग्रहण सुविधाओं का उपयोग करते हैं। इन्हें संदर्भित नहीं किया गया है, इसलिए फ़ाइल तब तक अनिश्चित काल तक खुली रहेगी जब तक कि कचरा कलेक्टर ऑब्जेक्ट की स्मृति को पुनः प्राप्त करने का निर्णय नहीं लेता है या प्रोग्राम समाप्त हो जाता है।

तो आम तौर पर with: या try:...finally: का उपयोग करके फ़ाइल को स्पष्ट रूप से बंद करना महत्वपूर्ण है।

बेशक यह सब किसी अन्य प्रकार के ऑब्जेक्ट के लिए सच है जिसके लिए स्पष्ट सफाई की आवश्यकता है।

+1

+1, सभी अच्छे अंक जिन्हें मैंने उल्लेख करने के लिए परेशान नहीं किया। :) – FogleBird

+1

"परेशान नहीं किया" - मुझे इनमें से कोई भी नहीं पता था। :( – bodacydo

+0

इन सभी महत्वपूर्ण बिंदुओं का जिक्र करने के लिए धन्यवाद! – bodacydo

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

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