अजगर फ़ाइल मोड "w +" द्वारा भ्रमित


202

से दस्तावेज़ ,

मोड 'r +', 'w +' और 'a' अपडेट करने के लिए फ़ाइल खोलें (ध्यान दें कि 'w +' फ़ाइल को काटती है)। बाइनरी मोड में फ़ाइल को खोलने के लिए मोड पर 'बी' को भेजें, उन प्रणालियों पर जो द्विआधारी और पाठ फ़ाइलों के बीच अंतर करते हैं; जिन सिस्टमों में यह अंतर नहीं है, उन्हें जोड़ने पर 'b' का कोई प्रभाव नहीं पड़ता है।

और यहाँ

w +: लिखने और पढ़ने दोनों के लिए एक फाइल खोलता है। मौजूदा फ़ाइल को अधिलेखित कर देता है यदि फ़ाइल मौजूद है। यदि फ़ाइल मौजूद नहीं है, तो पढ़ने और लिखने के लिए एक नई फ़ाइल बनाता है।

लेकिन, कैसे एक फ़ाइल के साथ खुला पढ़ने के लिए w+?


27
मुझे यह आरेख काफी उपयोगी लगा।
ऋत्विक

जवाबों:


132

मान लीजिए कि आप एक withस्टेटमेंट के साथ फाइल खोल रहे हैं जैसे आपको होना चाहिए। तब आप अपनी फ़ाइल से पढ़ने के लिए कुछ ऐसा करेंगे:

with open('somefile.txt', 'w+') as f:
    # Note that f has now been truncated to 0 bytes, so you'll only
    # be able to read data that you write after this point
    f.write('somedata\n')
    f.seek(0)  # Important: return to the top of the file before reading, otherwise you'll just read an empty string
    data = f.read() # Returns 'somedata\n'

ध्यान दें f.seek(0)- यदि आप इसे भूल जाते हैं, तो f.read()कॉल फ़ाइल के अंत से पढ़ने की कोशिश करेगी, और एक खाली स्ट्रिंग लौटा देगी।


1
"0 बाइट्स के लिए छोटा" का क्या अर्थ है?
Nasif Imtiaz Ohi

22
@NasifImtiazOhi - पायथन डॉक्स का कहना है कि w+"फ़ाइल मौजूद होने पर मौजूदा फ़ाइल को अधिलेखित कर देगा"। इसलिए जैसे ही आप किसी फ़ाइल को खोलते हैं w+, यह अब एक खाली फ़ाइल है: इसमें 0 बाइट्स होते हैं। यदि इसमें डेटा होता था, तो उस डेटा को काट दिया गया - काट दिया गया और फेंक दिया गया - और अब फ़ाइल का आकार 0 बाइट्स है, इसलिए आप फ़ाइल को खोलने से पहले मौजूद किसी भी डेटा को नहीं पढ़ सकते हैं w+। यदि आप वास्तव में पिछले डेटा को पढ़ना चाहते हैं और इसे जोड़ना चाहते हैं, तो आपको r+इसके बजाय उपयोग करना चाहिए w+
r

शीर्ष पर नया डेटा कैसे जोड़ें?
बेका बुख़राज़े

1
@BeqaBukhradze - यदि आपका कोई प्रश्न है, तो "प्रश्न पूछें" बटन पर क्लिक करें, जहां यह सैकड़ों लोगों द्वारा देखा जाएगा। बस "टिप्पणी जोड़ें" बटन पर क्लिक न करें जहां केवल एक या दो लोग इसे देखेंगे।
rmunn

432

यहाँ एक फ़ाइल खोलने के विभिन्न तरीकों की सूची दी गई है:

  • आर

    केवल पढ़ने के लिए एक फ़ाइल खोलता है। फ़ाइल पॉइंटर को फ़ाइल की शुरुआत में रखा जाता है। यह डिफ़ॉल्ट मोड है।

  • rb

    केवल बाइनरी प्रारूप में पढ़ने के लिए एक फ़ाइल खोलता है। फ़ाइल पॉइंटर को फ़ाइल की शुरुआत में रखा जाता है। यह डिफ़ॉल्ट मोड है।

  • r +

    पढ़ने और लिखने दोनों के लिए एक फाइल खोलता है। फ़ाइल पॉइंटर फ़ाइल की शुरुआत में होगा।

  • rb +

    द्विआधारी प्रारूप में पढ़ने और लिखने दोनों के लिए एक फ़ाइल खोलता है। फ़ाइल पॉइंटर फ़ाइल की शुरुआत में होगा।

  • w

    केवल लिखने के लिए एक फ़ाइल खोलता है। फ़ाइल मौजूद है, तो फ़ाइल को अधिलेखित कर देता है। यदि फ़ाइल मौजूद नहीं है, तो लिखने के लिए एक नई फ़ाइल बनाता है।

  • पश्चिम बंगाल

    केवल बाइनरी प्रारूप में लिखने के लिए एक फ़ाइल खोलता है। फ़ाइल मौजूद है, तो फ़ाइल को अधिलेखित कर देता है। यदि फ़ाइल मौजूद नहीं है, तो लिखने के लिए एक नई फ़ाइल बनाता है।

  • w +

    लिखने और पढ़ने दोनों के लिए एक फाइल खोलता है। मौजूदा फ़ाइल को अधिलेखित कर देता है यदि फ़ाइल मौजूद है। यदि फ़ाइल मौजूद नहीं है, तो पढ़ने और लिखने के लिए एक नई फ़ाइल बनाता है।

  • पश्चिम बंगाल +

    द्विआधारी प्रारूप में लिखने और पढ़ने दोनों के लिए एक फ़ाइल खोलता है। मौजूदा फ़ाइल को अधिलेखित कर देता है यदि फ़ाइल मौजूद है। यदि फ़ाइल मौजूद नहीं है, तो पढ़ने और लिखने के लिए एक नई फ़ाइल बनाता है।

  • अपील करने के लिए एक फ़ाइल खोलता है। यदि फ़ाइल मौजूद है, तो फ़ाइल पॉइंटर फ़ाइल के अंत में है। यही है, फ़ाइल एपेंड मोड में है। यदि फ़ाइल मौजूद नहीं है, तो यह लिखने के लिए एक नई फ़ाइल बनाता है।

  • अब

    द्विआधारी प्रारूप में लागू करने के लिए एक फ़ाइल खोलता है। यदि फ़ाइल मौजूद है, तो फ़ाइल पॉइंटर फ़ाइल के अंत में है। यही है, फ़ाइल एपेंड मोड में है। यदि फ़ाइल मौजूद नहीं है, तो यह लिखने के लिए एक नई फ़ाइल बनाता है।

  • एक +

    दोनों को जोड़ने और पढ़ने के लिए एक फ़ाइल खोलता है। यदि फ़ाइल मौजूद है, तो फ़ाइल पॉइंटर फ़ाइल के अंत में है। फ़ाइल परिशिष्ट मोड में खुलती है। यदि फ़ाइल मौजूद नहीं है, तो यह पढ़ने और लिखने के लिए एक नई फ़ाइल बनाता है।

  • ab +

    द्विआधारी प्रारूप में दोनों को जोड़ने और पढ़ने के लिए एक फ़ाइल खोलता है। यदि फ़ाइल मौजूद है, तो फ़ाइल पॉइंटर फ़ाइल के अंत में है। फ़ाइल परिशिष्ट मोड में खुलती है। यदि फ़ाइल मौजूद नहीं है, तो यह पढ़ने और लिखने के लिए एक नई फ़ाइल बनाता है।


इसलिए सभी गहन उद्देश्यों के लिए, r + और w + समान हैं?
निक हमरिक

22
@Humdinger: नहीं, w+एक नई फ़ाइल बनाता है या किसी मौजूदा फ़ाइल को काटता है , फिर उसे पढ़ने और लिखने के लिए खोलता है; r+पढ़ने और लिखने के लिए इसे काटे बिना एक मौजूदा फ़ाइल खोलता है। बहुत अलग।
9

साथ ही, @ आलोक अग्रवाल के जवाब के साथ, यह मोड की एक विस्तृत सूची होने का दावा करता है, लेकिन ऐसा नहीं है।
9

1
यह बजाय मोड की एक विस्तृत सूची देने के लिए मूर्खतापूर्ण होगा, क्योंकि वे कई मापदंडों के साथ एक फ़ंक्शन की तरह अधिक कार्य करते हैं। r, wया aअनन्य हैं, लेकिन bउनमें से किसी में भी जोड़ा जा सकता है +, या U... यह एक दहनशील विस्फोट है।
rmunn

4
rbडिफ़ॉल्ट मोड नहीं है, उद्धरण: The most commonly-used values of mode are 'r' for reading, 'w' for writing (truncating the file if it already exists), and 'a' for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position). If mode is omitted, it defaults to 'r' docs.python.org/2/library/functions.html#open
iggy

158

पायथन में सभी फ़ाइल मोड

  • r पढ़ने के लिए
  • r+ पढ़ने और लिखने के लिए खुलता है (फ़ाइल को काट नहीं सकता)
  • w लिखने के लिये
  • w+ लिखने और पढ़ने के लिए (एक फ़ाइल को काट सकते हैं)
  • rbएक बाइनरी फ़ाइल पढ़ने के लिए। फ़ाइल पॉइंटर को फ़ाइल की शुरुआत में रखा जाता है।
  • rb+ बाइनरी फ़ाइल पढ़ना या लिखना
  • wb+ एक बाइनरी फ़ाइल लिखना
  • a+ जोड़ने के लिए खुलता है
  • ab+द्विआधारी में पढ़ने और पढ़ने दोनों के लिए एक फाइल खोलता है। यदि फ़ाइल मौजूद है, तो फ़ाइल पॉइंटर फ़ाइल के अंत में है। फ़ाइल परिशिष्ट मोड में खुलती है।
  • x अनन्य निर्माण के लिए खुला है, यदि फ़ाइल पहले से मौजूद है, तो विफल (Python 3)

5
यह सभी मोड नहीं है। यह उपेक्षा करता है, उदाहरण के लिए, rbऔर wb, U2.x में tमोड और 3.x में मोड का उल्लेख नहीं करने के लिए (जो दोनों को हर चीज के साथ जोड़ा जा सकता है b)।
9

1
R + और w + के बीच का अंतर यह है कि w + खुलने पर फ़ाइल को काट देता है। लेकिन आप इसे दोनों मोड में मैन्युअल रूप से छोटा कर सकते हैं।
मार्टिन

1
यह उत्तर @ 200 ओके द्वारा दिए गए उदाहरण के साथ स्पष्ट नहीं है, उदाहरण के wb+लिए फ़ाइल से भी पढ़ा जाता है?
सेलेरिटास

@Celeritas wb इंगित करता है कि फाइल बाइनरी मोड में लिखने के लिए खोली गई है। यूनिक्स सिस्टम (लिनक्स, मैक ओएस एक्स, आदि) पर, बाइनरी मोड कुछ भी नहीं करता है - वे पाठ फ़ाइलों को उसी तरह से व्यवहार करते हैं जैसे किसी अन्य फ़ाइलों का इलाज किया जाता है। विंडोज पर, हालांकि, टेक्स्ट फाइलें थोड़े संशोधित लाइन एंडिंग्स के साथ लिखी जाती हैं। वास्तविक बाइनरी फ़ाइलों, जैसे exe या jpg फ़ाइलों के साथ काम करते समय यह एक गंभीर समस्या का कारण बनता है। इसलिए, उन फ़ाइलों को खोलते समय जिन्हें टेक्स्ट नहीं माना जाता है, यहां तक ​​कि यूनिक्स में भी, आपको wb या rb का उपयोग करना चाहिए। केवल पाठ फ़ाइलों के लिए सादे w या r का उपयोग करें।
आलोक अग्रवाल

पायथन 3 में, 'x' ओपन मोड भी है: एक्सक्लूसिव क्रिएशन के लिए ओपन, अगर फाइल पहले से मौजूद है तो फेल। डॉक्टर में खुला कार्य देखें ।
लॉरेंट LAPORTE

9

r पढ़ने के लिए

w लिखने के लिए

r+ मूल सामग्री को हटाने के बिना पढ़ने / लिखने के लिए यदि फ़ाइल मौजूद है, अन्यथा अपवाद बढ़ाएं

w+ मूल सामग्री को हटाने के लिए तब पढ़ें / लिखें यदि फ़ाइल मौजूद है, अन्यथा फ़ाइल बनाएँ

उदाहरण के लिए,

>>> with open("file1.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file1.txt", "w+") as f:
...   f.write("c")
... 

$ cat file1.txt 
c$
>>> with open("file2.txt", "r+") as f:
...   f.write("ab\n")
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'file2.txt'
>>> with open("file2.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file2.txt", "r+") as f:
...   f.write("c")
... 

$ cat file2.txt 
cb
$

2

फ़ाइल काट दी गई है, इसलिए आप कॉल कर सकते हैं read()(कोई अपवाद नहीं उठाया गया, जब 'w' का उपयोग करके खोला गया हो), लेकिन आपको एक खाली स्ट्रिंग मिलेगी।


2

मुझे लगता है कि वहाँ दो तरीके हैं जो मुझे लगता है कि आप को प्राप्त करने की कोशिश कर रहे हैं संभाल करने के लिए कर रहे हैं।

1) जो स्पष्ट है, केवल पढ़ने के लिए फ़ाइल खोलें, इसे मेमोरी में पढ़ें फिर फ़ाइल को टी के साथ खोलें, फिर अपने परिवर्तन लिखें।

2) निम्न स्तर फ़ाइल हैंडलिंग दिनचर्या का उपयोग करें:

# Open file in RW , create if it doesn't exist. *Don't* pass O_TRUNC
 fd = os.open(filename, os.O_RDWR | os.O_CREAT)

उम्मीद है की यह मदद करेगा..


फिर क्या है r+
स्मार्टमंज

1

वास्तव में, r+मोड के बारे में अन्य सभी उत्तरों के बारे में कुछ गलत है।

test.in फ़ाइल की सामग्री content

hello1
ok2
byebye3

और पी स्क्रिप्ट है:

with open("test.in", 'r+')as f:
    f.readline()
    f.write("addition")

इसे निष्पादित करें और इसकी test.inसामग्री को इसमें बदल दिया जाएगा:

hello1
ok2
byebye3
addition

हालाँकि, जब हम स्क्रिप्ट को संशोधित करते हैं:

with open("test.in", 'r+')as f:
    f.write("addition")

test.inभी प्रतिक्रिया करते हैं:

additionk2
byebye3

इसलिए, r+यदि हम रीड ऑपरेशन नहीं करते हैं तो मोड हमें शुरुआत से ही कंटेंट को कवर करने की अनुमति देगा। और अगर हम कुछ रीड ऑपरेशन करते हैं, f.write()तो बस फ़ाइल में जोड़ देंगे।

वैसे, अगर हम f.seek(0,0)पहले f.write(write_content), राइट_ कॉन्टेंट उन्हें पॉज़िटॉन (0,0) से कवर करेंगे।


0

जैसा कि h4z3 द्वारा उल्लेख किया गया है , एक व्यावहारिक उपयोग के लिए, कभी-कभी आपका डेटा सब कुछ सीधे लोड करने के लिए बहुत बड़ा होता है, या आपके पास एक जनरेटर, या वास्तविक समय आने वाला डेटा होता है, आप फ़ाइल में संग्रहीत करने के लिए w + का उपयोग कर सकते हैं और बाद में पढ़ सकते हैं।

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