2008-09-22 12 views

उत्तर

141

आपको हमेशा open() का उपयोग करना चाहिए।

documentation राज्यों के रूप में:

जब एक फ़ाइल खोलने, इसका इस्तेमाल करने के लिए खुला() इस निर्माता सीधे लागू करने के बजाय बेहतर है। फ़ाइल अधिक परीक्षण प्रकार टाइप करने के लिए उपयुक्त है (उदाहरण के लिए, लेखन "isinstance (f, फ़ाइल)")।

इसके अलावा, file()has been removed पायथन 3.0 के बाद से।

+20

यह परेशान है, क्योंकि प्रलेखन "राज्य() कन्स्ट्रक्टर पाइथन 2.2 में नया है। पिछली वर्तनी, खुली() को संगतता के लिए बनाए रखा गया है, और फ़ाइल() के लिए उपनाम है।" चूंकि मैंने दस साल पहले आरटीएफएम का फैसला किया था, और प्रकार और कक्षाओं के एकीकरण के बहुत शौकीन हो गए, मैंने कभी भी खुले() को कभी भी उपयोग नहीं किया। इसके अलावा, मुझे अभी भी लगता है कि टाइप कन्स्ट्रक्टर पथ तर्क द्वारा स्थित ऑब्जेक्ट जैसी ऑब्जेक्ट को वापस करने का तरीका और मोड तर्क में अनुरोध के रूप में व्यवहार करने का अधिक स्पष्ट तरीका है। मैं विशेष रूप से इस तरह महसूस करता हूं जब देवों के स्पष्ट इरादे को 2 ओपन 4 कॉम्पैक्ट बनाए रखा गया था। – umeboshi

6

कार्यात्मक रूप से, दोनों समान हैं; open वैसे भी file पर कॉल करेगा, इसलिए वर्तमान में अंतर शैली का विषय है। Python docsopen का उपयोग करने की सलाह देते हैं।

फ़ाइल खोलते समय, फ़ाइल कन्स्ट्रक्टर को सीधे आमंत्रित करने के बजाय खुले() का उपयोग करना बेहतर होता है।

कारण यह है कि भविष्य के संस्करणों में वे एक ही (open एक कारखाने समारोह है, जो पथ इसे खोलने के आधार पर विभिन्न प्रकार की वस्तुओं रिटर्न हो जाएगा) होने की गारंटी नहीं है।

+2

खुला पहले से ही एक कारखाना समारोह है, इसलिए कार्यात्मक मतभेद हैं (उदाहरण के लिए विरासत, इन्सिंस्टेंस() आदि) – Brian

31

दो कारण: "इसे करने का एक तरीका होना चाहिए" और file का पाइथन दर्शन दूर जा रहा है।

file वास्तविक प्रकार है (उदाहरण के लिए file('myfile.txt') इसका निर्माता कह रहा है)। open एक कारखाना फ़ंक्शन है जो एक फ़ाइल ऑब्जेक्ट लौटाएगा।

अजगर 3.0 file में किया जा रहा से स्थानांतरित करने के लिए जा रहा है एक अंतर्निहित io पुस्तकालय (कुछ बफ़र पाठकों के साथ जावा के समान, आदि)

+0

क्या कारण हैं? – Matt

4

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

निम्नलिखित पायथन 2.6 दस्तावेज़ों से है। [ब्रैकेट सामान] मेरे द्वारा जोड़ा गया।

फ़ाइल खोलते समय, यह [फ़ाइल()] कन्स्ट्रक्टर को सीधे आमंत्रित करने के बजाय खुले() का उपयोग करना बेहतर है। फ़ाइल (उदाहरण के लिए, (च, फ़ाइल isinstance लेखन)

2
श्री वान Rossum के अनुसार

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

+2

यह अब 2.5 –

19

file एक प्रकार, int या list की तरह है। open() फ़ाइलों को खोलने के लिए एक समारोह है, और एक file वस्तु वापस आ जाएगी।

class LoggingFile(file): 
    def write(self, data): 
     sys.stderr.write("Wrote %d bytes\n" % len(data)) 
     super(LoggingFile, self).write(data) 

जैसा कि आप देख सकते हैं, वहाँ के लिए एक अच्छा कारण नहीं है:

f = open(filename, 'r') 
for line in f: 
    process(line) 
f.close() 

यह जब आप फ़ाइल का उपयोग करना चाहिए का एक उदाहरण है:

यह खुला जब आप का उपयोग करना चाहिए का एक उदाहरण है दोनों मौजूद हैं, और दोनों के लिए स्पष्ट उपयोग-मामला।

+4

में सच नहीं है, आम तौर पर, फाइलों को 'साथ' कथन के साथ खोला जाना चाहिए। 'खुले (फ़ाइल नाम,' आर ') के साथ f: \ f में लाइन के लिए \ \ प्रक्रिया (रेखा) '। यह स्पष्ट बंद से बचाता है। पायथन 2.6 और ऊपर मूल रूप से 'साथ' कथन का समर्थन करते हैं। पायथन 2.5 में, आपको अपने कोड के शीर्ष पर '__future__ आयात से _statement'' जोड़ना होगा। – IceArdor

+0

क्या आपने दूसरे उदाहरण में अंतर्निहित नाम को फिर से परिभाषित नहीं किया था? – planetp

+1

@planetp, दूसरा उदाहरण सिर्फ फ़ाइल वर्ग से विरासत में मिलता है। मुझे लगता है कि यह अजीब बात है कि यह कम मामले में है, लेकिन इस तरह यह मूल बिल्टिन प्रकारों (जैसे ऑब्जेक्ट, स्ट्र, सूची, ...) – yoniLavi

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