पढ़ने और लिखने दोनों के लिए फाइल कैसे खोलें?


210

क्या पढ़ने और लिखने दोनों के लिए फाइल खोलने का कोई तरीका है?

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


3
आप क्या समस्या हल कर रहे हैं? हो सकता है कि फ़ाइल लिखने / पढ़ने से बेहतर कोई उपाय हो, जैसेmmap
रोमन बोडनार्चुक

1
क्या आप हमें अपना कोड दे सकते हैं ताकि हम आपको जवाब दे सकें। आप एक बार देखने का भी प्रयास कर सकते हैं: docs.python.org/tutorial/… । हालाँकि मैंने r + b का उपयोग करने की कोशिश की है और यह काम करता है। इसके अलावा अलग-अलग कार्यों में एक फ़ाइल डिस्क्रिप्टर का उपयोग करने का कोई लाभ है?
आर्ट्सिओम रुडजेनका

@RomanBodnarchuk mmapएक महान विचार है, लेकिन क्या होगा यदि आपको संगामिति से निपटना है? क्या पहुंच को आरक्षित करने का कोई तरीका है?
Dr_Zaszuś

जवाबों:


267

यहां बताया गया है कि आप किसी फ़ाइल को कैसे पढ़ते हैं, और फिर उसे लिखते हैं (किसी भी मौजूदा डेटा को अधिलेखित करते हैं), बिना बंद और फिर से खोलने के:

with open(filename, "r+") as f:
    data = f.read()
    f.seek(0)
    f.write(output)
    f.truncate()

41
a+एंड-केस को कवर करने के लिए उपयोग करें कि फ़ाइल मौजूद नहीं है (बनाई जाएगी)
जोसेफ हारुश

16
तलाश () और ट्रंकट () दोनों महत्वपूर्ण हैं!
smwikipedia

4
@JossefHarush ध्यान दें कि aकुछ यूनिक्स सिस्टम पर राज्यों के लिए प्रलेखन का मतलब है कि सभी वर्तमान स्थिति की परवाह किए बिना फ़ाइल के अंत में संलग्न हैं। ' इस मामले f.seek(0)में अपेक्षा के अनुरूप काम नहीं होगा। मैं बस लिनक्स पर इस की बेईमानी से गिर गया।
ग्रीम

6
बेहतर तुम समझा यह क्यों seekऔर truncateयहाँ प्रयोग किया जाता है। ज्यादातर पाठक गूगल से आते हैं और कॉपी-पेस्ट करते हैं।
शिप्लू मोकादिम

8
फ़ाइल को पढ़ने के बाद, फ़ाइल पॉइंटर (fp) आगे बढ़ गया है, इसलिए आपको इसे शुरुआत में सेट करने की आवश्यकता है। यह है कि seek(0): यह करने के लिए स्थिति 0( यानी शुरुआत) fp देता है । truncate()फ़ाइल को बाइट्स की दी गई संख्या तक काटें, अर्थात निर्दिष्ट बाइट्स के बाद फ़ाइल की सभी सामग्री हटा दें। कल्पना करें कि आपकी फ़ाइल में स्ट्रिंग है Hello, worldऔर आप लिखते हैं Bye। यदि आप truncate()अंत में सामग्री नहीं रखते हैं Byelo, world, तो आपने फ़ाइल में मौजूद पाठ को कभी नहीं हटाया है। truncate()वर्तमान fp में फ़ाइल को काट देता है।
इलिया गेरासिमचुक

48

r+एक ही समय में पढ़ने और लिखने के लिए विहित विधा है। यह fopen()सिस्टम कॉल का उपयोग करने से अलग नहीं है क्योंकि file()/ open()इस ऑपरेटिंग सिस्टम कॉल के आसपास सिर्फ एक छोटा आवरण है।


यह फाइल कंटेंट को
बढ़ाता है

47

I / O व्यवहारों को सारांशित करें

|          Mode          |  r   |  r+  |  w   |  w+  |  a   |  a+  |
| :--------------------: | :--: | :--: | :--: | :--: | :--: | :--: |
|          Read          |  +   |  +   |      |  +   |      |  +   |
|         Write          |      |  +   |  +   |  +   |  +   |  +   |
|         Create         |      |      |  +   |  +   |  +   |  +   |
|         Cover          |      |      |  +   |  +   |      |      |
| Point in the beginning |  +   |  +   |  +   |  +   |      |      |
|    Point in the end    |      |      |      |      |  +   |  +   |

और निर्णय शाखा

यहां छवि विवरण दर्ज करें


ट्री आरेख बनाने के लिए आपने किस सॉफ्टवेयर का उपयोग किया?
फ्लक्स

मुझे भी दिलचस्पी होगी - दीया?
नीरदोक २ at

22

मैंने कुछ इस तरह की कोशिश की है और यह उम्मीद के मुताबिक काम करता है:

f = open("c:\\log.log", 'r+b')
f.write("\x5F\x9D\x3E")
f.read(100)
f.close()

कहाँ पे:

f.read (आकार) - फ़ाइल की सामग्री को पढ़ने के लिए, f.read (आकार) को कॉल करें, जो कुछ मात्रा में डेटा को पढ़ता है और इसे स्ट्रिंग के रूप में लौटाता है।

तथा:

f.write (स्ट्रिंग) स्ट्रिंग की सामग्री को फ़ाइल में लिखता है, कोई नहीं लौटाता है।

यदि आप पाइथन ट्यूटोरियल को पढ़ने और लिखने वाली फाइलों के बारे में भी खोलते हैं, तो आप पाएंगे कि:

'r +' पढ़ने और लिखने दोनों के लिए फाइल खोलता है।

विंडोज पर, मोड में संलग्न 'बी' फ़ाइल को बाइनरी मोड में खोलता है, इसलिए 'आरबी', 'डब्ल्यूबी' और 'आर + बी' जैसे मोड भी हैं।


5
इसके अलावा पढ़ना तब लिखना 'r + b' मोड का उपयोग करके समान रूप से काम करता है, लेकिन आपको फ़ाइल की शुरुआत में कर्सर को वापस रखने के लिए f.read () और f.write () के बीच f.seek (0) का उपयोग करना होगा।
जाबोरस

2
ध्यान दें कि यदि आप जो डेटा लिख ​​रहे हैं, वह लंबे समय तक नहीं है कि डेटा पहले से ही है, तो यह छोटा नहीं होगा। truncateइसे रोकने के लिए विधि का उपयोग करें।
फ्लिम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.