2012-01-24 12 views
10

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

ValueError: The file 'filename' is already opened. Please close it before reopening in write mode.

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

Closing remaining open files: filename... done

वहाँ IPython निर्देश देने के लिए सत्र छोड़ने के बिना फ़ाइलों को बंद करने का कोई तरीका है: एक ही तरीका है यह दौर, जिस पर आप संदेश मिलता है बिंदु, IPython सत्र बंद करने के लिए हो रहा है?

+5

आप जब फाइलों के साथ काम हमेशा [ 'with'] (http://docs.python.org/reference/compound_stmts.html#the-with-statement) कथन का उपयोग करने के लिए प्रयास करना चाहिए उदाहरण के लिए, 'ओपन ("x.txt") के साथ fh के रूप में उपयोग करें: <डेटा के साथ कुछ करें> '। यह सुनिश्चित करता है कि अगर कुछ गलत हो जाता है तो फ़ाइल बंद होने की गारंटी है। – Chris

+1

@ क्रिस आपको इसे एक उत्तर के रूप में पोस्ट करना चाहिए क्योंकि सुझाव के लिए एकमात्र वैध और सरल समाधान – JBernardo

+0

@JBernardo धन्यवाद है। – Chris

उत्तर

8

आप की कोशिश करनी चाहिए करने के लिए एक बार देख ले हमेशा with बयान जब का उपयोग फाइलों के साथ काम करना उदाहरण के लिए, की तरह

with open("x.txt") as fh: 
    ...do something with the file handle fh 

यह सुनिश्चित करता है कि कुछ with ब्लॉक के निष्पादन के दौरान गलत हो जाता है, और एक अपवाद उठाया जाता है, फाइल बंद कर दी जाना निश्चित है कुछ का उपयोग करें। इस पर अधिक जानकारी के लिए with documentation देखें।

संपादित करें: टिप्पणियों में चर्चा के बाद, ऐसा लगता है कि ओपी को एक ही समय में कई फाइलें खोलने की आवश्यकता है और एक साथ कई फाइलों से डेटा का उपयोग करने की आवश्यकता है। जाहिर है कि बहुत से नेस्टेड with कथन हैं, प्रत्येक फ़ाइल खोले जाने के लिए, एक विकल्प नहीं है और आदर्श के खिलाफ चला जाता है कि "फ्लैट नेस्टेड से बेहतर है"।

एक विकल्प try/finally ब्लॉक में गणना को लपेटना होगा। उदाहरण

file_handles = [] 
try: 
    for file in file_list: 
     file_handles.append(open(file)) 

    # Do some calculations with open files 

finally: 
    for fh in file_handles: 
     fh.close() 

के लिए अंत में ब्लॉक भले ही एक अपवाद हुई कोड है जो किसी भी try, except या else ब्लॉक के पीछे भागता किया जाना चाहिए होता है,। documentation से:

If finally is present, it specifies a "cleanup" handler. The try clause is executed, including any except and else clauses. If an exception occurs in any of the clauses and is not handled, the exception is temporarily saved. The finally clause is executed. If there is a saved exception, it is re-raised at the end of the finally clause. If the finally clause raises another exception or executes a return or break statement, the saved exception is lost. The exception information is not available to the program during execution of the finally clause.

+0

ठीक है लेकिन इस दृष्टिकोण के साथ मुझे जो परेशानी हो रही है वह यह है कि मैं लूप में कुछ फाइलें खोल रहा हूं, उदा।'fname_list में fname के लिए: file_list.append (खुला (fname)) क्योंकि बाद में मुझे सूची में संचालन करना है। अगर मैं 'साथ ...' दृष्टिकोण का उपयोग करता हूं तो सभी फाइलें लूप में बंद होती हैं - यानी मेरे पास एकाधिक फाइलें नहीं खुलती हैं। – tdc

+0

क्या आपको एक साथ कई फाइलें खोलने की ज़रूरत है? यदि नहीं, तो बस fname_list में fname के लिए उपयोग करें: fh के रूप में खुला (fname) के साथ: <फ़ाइल स्ट्रीम fh> 'के साथ कुछ करें। आपकी मूल समस्या का एक हिस्सा यह था कि आपने फ़ाइलों को खोल दिया और फिर उन्हें बंद करने का कोई तरीका नहीं था, हम कुछ गलत हो गए थे - एक समय में केवल एक को खोलना सुरक्षित है। – Chris

+0

मुझे कई फाइलें खोलने की ज़रूरत है क्योंकि मेरे पास HDF5 में डेटा के कई सेट हैं और मैं उन्हें एक्सेस करने के लिए pytables का उपयोग कर रहा हूं। Pytables का उपयोग करने के लिए फ़ाइलों को – tdc

7

कुछ विचार:

  • उपयोग हमेशा finally (या एक with ब्लॉक) जब फाइलों के साथ काम है, तो वे ठीक से बंद हो जाती हैं।
  • आप आँख बंद करके गैर मानक फ़ाइल वर्णनकर्ता का उपयोग कर जहां n 2 से बड़ा अंक है बंद कर सकते हैं (इस यूनिक्स विशिष्ट है, तो आप /proc/ipython_pid/fd/ झांक सकते हैं कि क्या प्रक्रिया descriptors अब तक खोला है देखने के लिए चाहते हो सकता है)।
  • आप निरीक्षण कर सकते हैं पर कब्जा कर लिया ढेर स्थानीय लोगों फ्रेम आप स्वच्छंद फाइल करने के लिए संदर्भ खोजने के लिए और यह सफल हो जाती है को देखने के लिए ... sys.last_traceback
संबंधित मुद्दे