पायथन - जब फ़ाइल बनाम ओपन का उपयोग करना हो


138

पायथन में fileऔर क्या अंतर है open? मुझे कौन सा उपयोग करना चाहिए? (मैं 2.5 में हूँ)

जवाबों:


153

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

जैसा कि प्रलेखन में कहा गया है:

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

इसके अलावा, पायथन 3.0 के बाद से file() हटा दिया गया है


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

32

दो कारण: "वहाँ ऐसा करने का एक तरीका होना चाहिए" का अजगर दर्शन और fileदूर हो रहा है।

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

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


3
किस कारण से दो?
मैट

19

file()एक प्रकार है, एक इंट या सूची की तरह। open()फ़ाइलों को खोलने के लिए एक फ़ंक्शन है, और वापस आ जाएगाfile ऑब्जेक्ट ।

यह एक उदाहरण है जब आपको खुले का उपयोग करना चाहिए:

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

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

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

जैसा कि आप देख सकते हैं, दोनों के अस्तित्व के लिए एक अच्छा कारण है, और दोनों के लिए एक स्पष्ट उपयोग-मामला है।


5
आम तौर पर, फाइलों को withबयान के साथ खोला जाना चाहिए । with open(filename, 'r') as f: \ for line in f: \ process(line)। यह स्पष्ट निकट से बचा जाता है। पायथन 2.6 और इसके बाद के संस्करण मूल रूप से withबयान का समर्थन करते हैं । पायथन 2.5 में, आपको from __future__ import with_statementअपने कोड के शीर्ष पर जोड़ना होगा ।
IceArdor

क्या आपने दूसरे उदाहरण में बिल्ट-इन नाम को फिर से परिभाषित नहीं किया है?
११

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

1
पायथन 2.5 में, fileवर्ग विशेष विधियों से सुसज्जित था जो कि जब भी एक withबयान के माध्यम से फ़ाइल को खोला जाता है, स्वचालित रूप से कहा जाता है । ये विशेष विधियां यह सुनिश्चित करती हैं कि फ़ाइल ठीक से और सुरक्षित रूप से खोली और बंद हो।
मौसी 5043

7

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

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

कारण यह है कि भविष्य के संस्करणों में वे एक ही होने की गारंटी नहीं है ( openएक कारखाना फ़ंक्शन बन जाएगा, जो अलग-अलग प्रकार की वस्तुओं को उसके रास्ते के आधार पर लौटाता है)।


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

4

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

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

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


2

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.