python - पाइथन में पूरी फाइल पढ़ना




file-io filehandle (2)

यदि आप content = open('Path/to/file', 'r').read() साथ एक पूरी फ़ाइल content = open('Path/to/file', 'r').read() क्या फ़ाइल हैंडल स्क्रिप्ट से बाहर होने तक खुला रहता है? क्या पूरी फाइल पढ़ने के लिए कोई और संक्षिप्त तरीका है?


आप pathlib उपयोग कर सकते हैं।

पाइथन 3.5 और ऊपर के लिए:

from pathlib import Path
contents = Path(file_path).read_text()

पाइथन के निचले संस्करणों के लिए pathlib2 उपयोग pathlib2 :

$ pip install pathlib2

फिर:

from pathlib2 import Path
contents = Path(file_path).read_text()

यह वास्तविक read_text implementation :

def read_text(self, encoding=None, errors=None):
    """
    Open the file in text mode, read it, and close the file.
    """
    with self.open(mode='r', encoding=encoding, errors=errors) as f:
        return f.read()

उस प्रश्न का उत्तर विशेष पायथन कार्यान्वयन पर कुछ हद तक निर्भर करता है।

यह समझने के लिए कि यह सब कुछ क्या है, वास्तविक file ऑब्जेक्ट पर विशेष ध्यान दें। आपके कोड में, उस ऑब्जेक्ट का केवल एक बार अभिव्यक्ति में उल्लेख किया गया है, और read() कॉल रिटर्न के तुरंत बाद पहुंच से बाहर हो जाता है।

इसका मतलब है कि फ़ाइल ऑब्जेक्ट कचरा है। एकमात्र शेष प्रश्न यह है कि "कचरा कलेक्टर फ़ाइल ऑब्जेक्ट कब एकत्र करेगा?"।

सीपीथॉन में, जो एक संदर्भ काउंटर का उपयोग करता है, इस प्रकार का कचरा तुरंत देखा जाता है, और इसलिए इसे तुरंत एकत्र किया जाएगा। यह आमतौर पर अन्य अजगर कार्यान्वयन के बारे में सच नहीं है।

एक बेहतर समाधान, यह सुनिश्चित करने के लिए कि फ़ाइल बंद है, यह पैटर्न है:

with open('Path/to/file', 'r') as content_file:
    content = content_file.read()

ब्लॉक समाप्त होने के तुरंत बाद फ़ाइल हमेशा बंद हो जाएगी; भले ही एक अपवाद होता है।

संपादित करें: इस पर एक बेहतर बिंदु डालने के लिए:

file.__exit__() , जिसे संदर्भ प्रबंधक सेटिंग के with "स्वचालित रूप से" कहा जाता है, file.close() को स्वचालित रूप से बुलाया जाने वाला एकमात्र अन्य तरीका है (यानी, इसे स्पष्ट रूप से स्वयं कहकर छोड़कर) file.__del__() माध्यम से होता file.__del__() । यह हमें __del__() कहलाता है के सवाल पर ले जाता है?

एक सही ढंग से लिखित कार्यक्रम यह नहीं मान सकता कि फाइनलर कभी भी प्रोग्राम समाप्ति से पहले किसी भी समय दौड़ेंगे।

- http://blogs.msdn.com/b/oldnewthing/archive/2010/08/09/10047586.aspx

विशेष रूप से:

ऑब्जेक्ट्स कभी स्पष्ट रूप से नष्ट नहीं होते हैं; हालांकि, जब वे पहुंचने योग्य नहीं होते हैं तो वे कचरे से एकत्र हो सकते हैं। कचरा संग्रह स्थगित करने या इसे पूरी तरह से छोड़ने के लिए एक कार्यान्वयन की अनुमति है - यह क्रियान्वयन की गुणवत्ता का मामला है कि कैसे कचरा संग्रह लागू किया जाता है, जब तक कोई वस्तु एकत्र नहीं की जाती है जो अभी भी पहुंच योग्य है।

[...]

सीपीथॉन वर्तमान में एक संदर्भ-गणना योजना का उपयोग करता है (वैकल्पिक) चक्रीय रूप से जुड़े कचरे की देरी से पता लगाने, जो जितनी जल्दी हो सके उतनी वस्तुओं को एकत्रित करता है, लेकिन सर्कुलर संदर्भ वाले कचरे को इकट्ठा करने की गारंटी नहीं है।

- https://docs.python.org/3.5/reference/datamodel.html#objects-values-and-types

(जोर मेरा)

लेकिन जैसा कि यह सुझाव देता है, अन्य कार्यान्वयन में अन्य व्यवहार हो सकता है। उदाहरण के तौर पर, पीईपीई में 6 अलग कचरा संग्रहण कार्यान्वयन है !





filehandle