পাইথনে একটি ফাইল পড়ুন এবং ওভাররাইট করুন


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
@ ভলভক্স এই কোডে f.write(text)আগে f.truncate()রয়েছে; এটি textপ্রথমটি লিখেছে , সুতরাং .write()ফাইল কার্সারের শেষে অবস্থিত হওয়ার পরে text। ফাইলটি ছাঁটাই করার প্রক্রিয়া চালিয়ে যাওয়া এই পয়েন্টের পরে ফাইলের যা কিছু বাকী রয়েছে তা সরিয়ে ফেলবে। এই ক্ষেত্রে, শেষের ফলাফলটি একই রকম হবে যেন আপনি লেখার আগে ছেঁটে ফেলেছেন।
nosklo

খুব বড় ফাইলগুলির জন্য, সম্পূর্ণ ফাইলের সামগ্রীগুলি মেমরির মধ্যে পড়াই অযৌক্তিক হয়ে উঠতে পারে। অতএব, fileinputমডিউলটি পছন্দসই পদ্ধতিতে পরিণত হতে পারে। পাস inplace=1করার পরে এটি ফাইলটিকে প্রথমে অস্থায়ী স্থানে সরিয়ে নিয়ে যাবে, তারপরে পুরানো ফাইল নাম পথে নতুন ফাইলটি লিখবে। এই মুভ অপারেশনটি ইউনিক্স ফাইল সিস্টেমে দ্রুততর, কারণ এটি কেবল ফাইল সিস্টেমটিকে সরিয়ে দেয় inode, সম্পূর্ণ সামগ্রী নয়। তারপরে মেমরি ফুলে যাওয়া এড়াতে আপনি প্রতিটি লাইনে স্বতন্ত্রভাবে পড়তে ও প্রক্রিয়া করতে পারেন। :-)
২in:

16

সম্ভবত ফাইলটি বন্ধ করার পরে এটি সহজ এবং সুচারু হয়ে উঠবে text = re.sub('foobar', 'bar', text), লেখার জন্য এটি আবার খুলুন (এইভাবে পুরানো সামগ্রীগুলি সাফ করুন), এবং এতে আপনার আপডেট হওয়া পাঠ্য লিখুন।


16

fileinputমডিউল একটি হয়েছে inline, অস্থায়ী ফাইল ব্যবহার ইত্যাদি মডিউল চমত্কারভাবে ফাইল তালিকায় লাইনের উপর লুপিং সাধারণ অপারেশন encapsulates ছাড়া আপনি যে ফাইলটি প্রক্রিয়া করছি পরিবর্তন লেখার জন্য মোড একটি বস্তু যা স্বচ্ছভাবে ফাইলের নাম ট্র্যাক রাখে মাধ্যমে লাইন নম্বর ইত্যাদি যদি আপনার লুপের ভিতরে সেগুলি পরীক্ষা করতে চান।

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()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.