2010-03-11 16 views
83

में एक फ़ाइल वर्तमान में मैं इस का उपयोग कर रहा अधिलेखित:पढ़ें और अजगर

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

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

उत्तर

142

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

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

कार्यक्षमता भी cleaner and safer mVChr की टिप्पणी, प्रति with open as का उपयोग कर किया जा सकता है जो हैडलर बंद कर देगा, भले ही कोई त्रुटि हो।

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

धन्यवाद और अच्छा जवाब की कोशिश करो। मैं यह भी नोट करना चाहता था कि फ़ाइल को ओपन (फ़ाइल नाम, 'आर +') में फ़ाइल को खोलने के लिए सबसे अच्छा अभ्यास है: 'ब्लॉक, जिस तरह से यह अपवाद होने पर भी ब्लॉक के अंत में फ़ाइल को स्वचालित रूप से बंद कर देता है । – mVChr

14

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

14

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

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

एक नई फ़ाइल में इसे लिखने ..

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() 
संबंधित मुद्दे