कैसे अजगर 2.4 में सुरक्षित रूप से / बंद फ़ाइलों को खोलने के लिए


86

मैं वर्तमान में पायथन का उपयोग कर हमारे एक सर्वर पर उपयोग के लिए एक छोटी सी स्क्रिप्ट लिख रहा हूं। सर्वर में केवल Python 2.4.4 स्थापित है।

जब तक 2.5 आउट नहीं हो जाता, तब तक मैंने पायथन का उपयोग शुरू नहीं किया था, इसलिए मुझे फॉर्म का उपयोग करना है:

with open('file.txt', 'r') as f:
    # do stuff with f

हालाँकि, with2.5 के पहले कोई बयान नहीं है , और मुझे फ़ाइल ऑब्जेक्ट को मैन्युअल रूप से साफ़ करने के उचित तरीके के बारे में उदाहरण खोजने में परेशानी हो रही है।

अजगर के पुराने संस्करणों का उपयोग करते समय फ़ाइल ऑब्जेक्ट्स को सुरक्षित रूप से निपटाने के लिए सबसे अच्छा अभ्यास क्या है?

जवाबों:


139

देखें docs.python.org :

जब आप किसी फ़ाइल के साथ काम करते हैं, तो उसे बंद करने के लिए f.close () को कॉल करें और खुली फ़ाइल द्वारा उठाए गए किसी भी सिस्टम संसाधनों को मुक्त करें। F.close () को कॉल करने के बाद, फ़ाइल ऑब्जेक्ट का उपयोग करने का प्रयास स्वचालित रूप से विफल हो जाएगा।

इसलिए का उपयोग close()के साथ सुंदर ढंग से try/finally:

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
    f.close()

यह सुनिश्चित करता है कि यदि # do stuff with fकोई अपवाद उठाता है, तब fभी वह ठीक से बंद रहेगा।

ध्यान दें कि openदिखाई देनी चाहिए बाहर की try। यदि openस्वयं कोई अपवाद उठाता है, तो फ़ाइल नहीं खोली गई और उसे बंद करने की आवश्यकता नहीं है। इसके अलावा, यदि openकोई अपवाद उठाता है तो उसका परिणाम नहीं सौंपा जाता है fऔर यह कॉल करने के लिए एक त्रुटि है f.close()


बहुत सरल, धन्यवाद। किसी कारण से मैं उम्मीद कर रहा था कि मुझे कुछ और शामिल करना होगा।
टीएम।

16
यदि openविफल रहता है, तो try/finallyब्लॉक को दर्ज करने से पहले एक अपवाद उठाया जाएगा । इसलिए closeनहीं बुलाया जाएगा। (इसीलिए आपको openइससे पहले कॉल करना चाहिए try।)
FogleBird

1
@TM मैंने openएक अपवाद बढ़ाने के बारे में एक नोट जोड़ा ।
जॉन-एरिक

4
यह वही है जो बयान के साथ पर्दे के पीछे अनुवाद करता है।
अरबलहेन

1
फ़ाइल खोलने की कोशिश के भीतर होना चाहिए।
एंथनी रटलेज

32

उपरोक्त समाधान में, यहां दोहराया गया है:

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
   f.close()

यदि कुछ बुरा होता है (आप कभी नहीं जानते ...) फ़ाइल को सफलतापूर्वक खोलने के बाद और कोशिश करने से पहले, फ़ाइल बंद नहीं होगी, इसलिए एक सुरक्षित स्थिति है:

f = None
try:
    f = open('file.txt', 'r')

    # do stuff with f

finally:
    if f is not None:
       f.close()

खुले (...) स्टेटमेंट के साथ, ब्लॉक के साथ समाप्त होने के बावजूद कोई फर्क नहीं पड़ता (एक अपवाद के साथ भी) फ़ाइल बंद है
Darkgaze

@ पार्कगेज़ with open(...)निश्चित रूप से आधुनिक पायथन में सबसे अच्छा विकल्प है।
mljrg

11

यदि आप उपयोग करते हैं तो डॉक्स के अनुसार फ़ाइल को बंद करने की आवश्यकता नहीं है:

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

>>> with open('workfile', 'r') as f:
...     read_data = f.read()
>>> f.closed
True

यहाँ और अधिक: https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects


यह प्रश्न का सही और विस्मृत दोनों है।
जॉन-एरिक

-4

यहां उदाहरण दिया गया है कि किस तरह से उपयोग करें openऔर "अजगर"close

from sys import argv
script,filename=argv
txt=open(filename)
print "filename %r" %(filename)
print txt.read()
txt.close()
print "Change the file name"
file_again=raw_input('>')
print "New file name %r" %(file_again)
txt_again=open(file_again)
print txt_again.read()
txt_again.close()

यह आवश्यक है कि आपने कितनी बार फ़ाइल खोली है उस समय को बंद करना है।


1
यदि एक अपवाद के बाद openलेकिन पहले उठाया जाता है close, तो इस दृष्टिकोण का उपयोग करके फ़ाइल को ठीक से बंद नहीं किया जाएगा। का उपयोग करना withया try/ finallyभी अपवाद की उपस्थिति में ठीक से फ़ाइल बंद कर देता है।
जॉन-एरिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.