2009-02-22 13 views
5

मैं पाइथन 2.5 के साथ विंडोज़ पर हूं। मेरे पास लेखन के लिए एक खुली फ़ाइल है। मैं कुछ डेटा लिखता हूँ। कॉल फ़ाइल बंद करें। जब मैं विंडोज एक्सप्लोरर का उपयोग कर फ़ोल्डर से फ़ाइल को हटाने की कोशिश करता हूं, तो यह त्रुटियां कहता है कि एक प्रक्रिया अभी भी फाइल को हैंडल रखती है।फ़ाइल.क्लोज़() को कॉल करने के बाद पाइथन फ़ाइल हैंडल क्यों जारी नहीं करता है?

अगर मैं पाइथन बंद करता हूं, और फिर कोशिश करता हूं, तो यह सफल होता है।

+0

मैंने कभी भी कुछ भी आसानी से * कुछ भी * रिलीज करने के लिए पाइथन को नहीं जाना है, कम छोटी फाइलों के साथ चलो। : पी: पी – Cerebrus

+0

@ सेर्बरस टी हे! – Pitarou

+1

सबसे छोटा पूरा प्रोग्राम पोस्ट करने का प्रयास करें जो आप कर सकते हैं जो त्रुटि प्रदर्शित करता है। यह नहीं हो रहा है इसलिए यह ठीक करने के लिए शायद कुछ आसान है। – dwc

उत्तर

4

यह उन्हें बंद करता है। क्या आप निश्चित हैं कि f.close() को कॉल किया जा रहा है? मैंने अभी एक ही परिदृश्य का परीक्षण किया और खिड़कियां मेरे लिए फाइल हटा देती हैं।

2

क्या आप फ़ाइल ऑब्जेक्ट के आस-पास कोई अपवाद प्रबंधित कर रहे हैं?

f = open('hello.txt') 
try: 
    perform_an_operation_that_causes_f_to_raise_an_exception() 
    f.close() 
except IOError: 
    pass 

आप देख सकते हैं, f.close:

f = open("hello.txt") 
try: 
    for line in f: 
     print line 
finally: 
    f.close() 

आपने ऐसा क्यों करना चाहिए, कोड की निम्न लाइनों पर विचार पर विचार करें: यदि हां, तो यकीन है कि त्रुटि हैंडलिंग कुछ इस तरह दिखता बनाने उपरोक्त कोड में कभी नहीं कहा जाएगा। समस्या यह है कि उपर्युक्त कोड एफ को कचरा इकट्ठा नहीं करेगा। कारण यह है कि एफ को अभी भी sys.traceback में संदर्भित किया जाएगा, इस मामले में एकमात्र समाधान है कि अंततः ब्लॉक पर बंद करें या sys.traceback को किसी भी को सेट न करें (और मैं दृढ़ता से पूर्व की अनुशंसा करता हूं)।

3

ट्यूटोरियल में विस्तार से बताया:

with open('/tmp/workfile', 'r') as f: 
    read_data = f.read() 

यह काम करता है जब आप लिख रहे हैं या अचार/unpickling भी

यह वास्तव में आवश्यक नहीं है कि अंत में ब्लॉक की कोशिश: नहीं, काम करने के जावा जिस तरह से अजगर

+0

यदि आप इससे पहले कोड को अपवाद फेंकने का मौका देते हैं, तो आप निश्चित रूप से 'आखिरकार' ब्लॉक चाहते हैं, जिसे किसी भी फाइल ऑपरेशन में करने की क्षमता है। – Davy8

+0

डेवी: अजगर 2.5 से बाद में फ़ाइल ऑब्जेक्ट '_enter_' और' _exit_' विधियों से लैस किया गया है। पायथन अभिव्यक्ति का मूल्यांकन करता है, '_enter_' विधि को कॉल करता है, फिर कोड बॉडी निष्पादित करता है, और इससे कोई फर्क नहीं पड़ता कि उस कोड में क्या होता है, गार्ड ऑब्जेक्ट की '_exit_' विधि को कॉल करें। यह अपवादों का ख्याल रखता है और हमेशा फ़ाइल को बंद करता है। विकल्पों के साथ अंत में कोशिश करें। आपको इसे सक्षम करना होगा: '__future__ से आयात_स्टेटमेंट' से –

0

मैं इसकी तलाश कर रहा था, क्योंकि वही बात मेरे साथ हुई थी। सवाल ने मेरी मदद नहीं की, लेकिन मुझे लगता है कि मुझे पता चला कि क्या हुआ।

मैंने लिखी लिपि के मूल संस्करण में, मैंने अपवाद के मामले में फ़ाइल में 'आखिरकार' खंड में जोड़ने की उपेक्षा की।

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

एक बार जब मैंने इंटरैक्टिव प्रॉम्प्ट बंद कर दिया, तो समस्या दूर हो गई, जिस पर मुझे याद आया कि फाइल खुली थी और महसूस हुआ कि क्या हो रहा था। (नैतिक: अपर्याप्त नींद पर कार्यक्रम करने की कोशिश न करें।))

स्वाभाविक रूप से, मुझे नहीं पता कि मूल पोस्टर के मामले में यह क्या हुआ है, और यहां तक ​​कि यदि मूल पोस्टर अभी भी आसपास है, तो वे विशिष्ट परिस्थितियों को याद नहीं रख सकता है, लेकिन लक्षण समान हैं, इसलिए मैंने सोचा कि मैं इसे जांचने के लिए कुछ जोड़ दूंगा, क्योंकि किसी भी स्थिति में पकड़े गए किसी भी व्यक्ति के लिए और उत्तर की तलाश है।

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