पायथन में एक फ़ाइल पढ़ें और अधिलेखित करें


108

वर्तमान में मैं इसका उपयोग कर रहा हूं:

f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()

लेकिन समस्या यह है कि पुरानी फ़ाइल नई फ़ाइल से बड़ी है। तो मैं एक नई फ़ाइल के साथ समाप्त होता हूं जिसमें पुरानी फ़ाइल का एक हिस्सा होता है।

जवाबों:


178

यदि आप दौड़ की स्थिति से बचने के लिए फ़ाइल को बंद और फिर से खोलना नहीं चाहते हैं, तो आप truncateयह कर सकते हैं:

f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
f.close()

कार्यक्षमता की संभावना भी हो जाएगा स्वच्छ और सुरक्षित का उपयोग कर openएक संदर्भ प्रबंधक, जो फ़ाइल हैंडलर बंद हो जाएगा के रूप में, एक त्रुटि तब होती है, भले ही!

with open(filename, 'r+') as f:
    text = f.read()
    text = re.sub('foobar', 'bar', text)
    f.seek(0)
    f.write(text)
    f.truncate()

बस मेरे दिमाग में स्पष्ट होना चाहिए - क्या आपकी दूसरी क्लिप के f.write(text)बाद होना चाहिए f.truncate()?
वोल्वोक्स

2
@volvox इस कोड f.write(text)से पहले f.truncate()है; यह textपहले लिखता है , इसलिए .write()फ़ाइल कर्सर के अंत में स्थित होने के बाद text। फ़ाइल को छोटा करने के लिए आगे बढ़ना इस बिंदु के बाद फ़ाइल के बचे हुए बाइट्स को हटा देगा। इस मामले में, अंतिम परिणाम वैसा ही होगा जैसे कि आप लिखने से पहले छंट गए।
nosklo

बहुत बड़ी फ़ाइलों के लिए, पूरी फ़ाइल सामग्री को मेमोरी में पढ़ना अनिर्दिष्ट हो सकता है। इसलिए, fileinputमॉड्यूल पसंदीदा तरीका बन सकता है। जब पास हो जाता है inplace=1, तो यह फ़ाइल को पहले अस्थायी स्थान पर ले जाएगा, फिर पुराने फ़ाइल नाम पथ पर एक नई फ़ाइल लिखें। यह मूव ऑपरेशन यूनिक्स फाइल सिस्टम पर तेजी से होता है, क्योंकि यह केवल फाइल सिस्टम को स्थानांतरित करता है inode, न कि पूरी सामग्री को। फिर आप मेमोरी ब्लोट से बचने के लिए प्रत्येक पंक्ति को व्यक्तिगत रूप से पढ़ और संसाधित कर सकते हैं। :-)
ट्रिनिट्रॉनएक्स

16

संभवतः यह फ़ाइल को बंद करने के बाद आसान होगा और इसे बंद करना होगा text = re.sub('foobar', 'bar', text), इसे लिखने के लिए फिर से खोलें (इस प्रकार पुरानी सामग्री को साफ़ करने के लिए), और अपने अद्यतन पाठ को इसे लिखें।


16

fileinputमॉड्यूल एक है inline, अस्थायी फ़ाइलों का उपयोग कर आदि मॉड्यूल अच्छी तरह से फ़ाइलों की एक सूची में लाइनों पर पाशन के आम आपरेशन समाहित बिना फ़ाइल आप कार्रवाई कर रहे हैं में परिवर्तन लिखने के लिए मोड एक वस्तु जो पारदर्शी रूप से फ़ाइल नाम का ट्रैक रखता है के माध्यम से, पंक्ति संख्या आदि यदि आप उन्हें लूप के अंदर निरीक्षण करना चाहते हैं।

import fileinput
for line in fileinput.FileInput("file",inplace=1):
    if "foobar" in line:
         line=line.replace("foobar","bar")
    print line

0

ईमानदारी से आप इस वर्ग पर एक नज़र डाल सकते हैं जो मैंने बनाया था जो मूल फ़ाइल संचालन करता है। लिखने का तरीका ओवरराइट और एपेंड करता है, पुराना डेटा रखता है।

class IO:
    def read(self, filename):
        toRead = open(filename, "rb")

        out = toRead.read()
        toRead.close()
        
        return out
    
    def write(self, filename, data):
        toWrite = open(filename, "wb")

        out = toWrite.write(data)
        toWrite.close()

    def append(self, filename, data):
        append = self.read(filename)
        self.write(filename, append+data)
        

-2

इसे एक नई फ़ाइल में लिखने का प्रयास करें।

f = open(filename, 'r+')
f2= open(filename2,'a+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.close()
f2.write(text)
fw.close()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.