সংযোজন পরিবর্তে প্রতিস্থাপন এবং ওভাররাইট করুন


96

আমার কাছে নিম্নলিখিত কোড রয়েছে:

import re
#open the xml file for reading:
file = open('path/test.xml','r+')
#convert to string:
data = file.read()
file.write(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>",r"<xyz>ABC</xyz>\1<xyz>\2</xyz>",data))
file.close()

যেখানে আমি নতুন সামগ্রীতে ফাইলটিতে থাকা পুরানো সামগ্রীটি প্রতিস্থাপন করতে চাই। যাইহোক, আমি যখন আমার কোডটি কার্যকর করি, "টেস্ট.এক্সএমএল" ফাইলটি যুক্ত হয়, অর্থাত্ পুরানো সামগ্রীটি নতুন "প্রতিস্থাপিত" সামগ্রী দ্বারা ভুগলাম। পুরানো জিনিসগুলি মুছতে এবং কেবল নতুন রাখার জন্য আমি কী করতে পারি?



যখন আপনি "ফাইলটিতে থাকা পুরানো সামগ্রীটি নতুন সামগ্রীর সাথে প্রতিস্থাপন করুন" বলবেন , আপনাকে পড়তে হবে এবং বর্তমান সামগ্রীগুলি রূপান্তর করতে হবে data = file.read()। আপনার অর্থ এই নয় যে "প্রথমে এটি পড়ার প্রয়োজন ছাড়াই অন্ধভাবে এটি ওভাররাইট"।
smci

উত্তর:


105

আপনি প্রয়োজন seekলেখার এবং তারপর ব্যবহার আগে ফাইলটি শুরুতে file.truncate()যদি আপনি inplace করতে প্রতিস্থাপন চাই:

import re

myfile = "path/test.xml"

with open(myfile, "r+") as f:
    data = f.read()
    f.seek(0)
    f.write(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>", r"<xyz>ABC</xyz>\1<xyz>\2</xyz>", data))
    f.truncate()

অন্য উপায়টি হ'ল ফাইলটি পড়ুন এবং আবার এটি দিয়ে খুলুন open(myfile, 'w'):

with open(myfile, "r") as f:
    data = f.read()

with open(myfile, "w") as f:
    f.write(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>", r"<xyz>ABC</xyz>\1<xyz>\2</xyz>", data))

না হয় ফাইলের ইনোড নম্বরটি পরিবর্তন করবে truncateনা (আমি দুবার পরীক্ষা করেছি, একবার উবুন্টু 12.04 এনএফএস এবং একবার এক্সটোর 4 দিয়ে))open(..., 'w')

যাইহোক, এটি আসলে পাইথনের সাথে সম্পর্কিত নয়। দোভাষী তার সাথে সংশ্লিষ্ট নিম্ন স্তরের এপিআই কল করে। পদ্ধতিটি truncate()সি প্রোগ্রামিং ভাষায় একই কাজ করে: দেখুন http://man7.org/linux/man-pages/man2/truncate.2.html


Neither truncate nor open(..., 'w') will change the inode number of the fileএটা কেন গুরুত্বপূর্ণ?
রক

@rok যদি ইনোড পরিবর্তন হয় বা না হয় বেশিরভাগ ক্ষেত্রে প্রাসঙ্গিক না হয়। কেবলমাত্র প্রান্তের ক্ষেত্রে যেখানে আপনি হার্ড-লিঙ্কগুলি ব্যবহার করেন তবে হার্ড লিঙ্কগুলি এড়াতে আমার পরামর্শ
guettli

66
file='path/test.xml' 
with open(file, 'w') as filetowrite:
    filetowrite.write('new content')

'ডাব্লু' মোডে ফাইলটি খুলুন, আপনি এর বর্তমান পাঠ্যটি নতুন সামগ্রীতে ফাইল সংরক্ষণ করে প্রতিস্থাপন করতে সক্ষম হবেন।


4
এটি কোনও ফাইল সাফ করার এবং এটিতে নতুন কিছু লেখার একটি ভাল উপায়, তবে প্রশ্নটি ফাইলটি পড়া, বিষয়বস্তুগুলি সংশোধন করা এবং নতুন সামগ্রীগুলির সাথে মূলটি ওভাররাইট করা সম্পর্কে ছিল।
বরিস

15

ব্যবহার করে truncate(), সমাধান হতে পারে

import re
#open the xml file for reading:
with open('path/test.xml','r+') as f:
    #convert to string:
    data = f.read()
    f.seek(0)
    f.write(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>",r"<xyz>ABC</xyz>\1<xyz>\2</xyz>",data))
    f.truncate()

4
seek এবং truncate !!! seekএকা কেন কাজ করছে না তা বুঝতে পারি না।
conner.xyz

2
import os#must import this library
if os.path.exists('TwitterDB.csv'):
        os.remove('TwitterDB.csv') #this deletes the file
else:
        print("The file does not exist")#add this to prevent errors

আমারও একই সমস্যা ছিল এবং আমার বিদ্যমান ফাইলটি বিভিন্ন 'মোড' ব্যবহার করে ওভাররাইট করার পরিবর্তে আমি আবার ফাইলটি ব্যবহার করার আগে ফাইলটি মুছে ফেলেছিলাম, যাতে এটি আমার কোডের প্রতিটি রানে একটি নতুন ফাইলে সংযোজন করছিল would ।


1

ফাইলগুলিতে স্ট্রিং প্রতিস্থাপনের পদ্ধতিটি দেখুন কীভাবে একটি সহজ উপায়ে কাজ করে এবং এটি একটি উত্তর যা এর সাথে কাজ করেreplace

fin = open("data.txt", "rt")
fout = open("out.txt", "wt")

for line in fin:
    fout.write(line.replace('pyton', 'python'))

fin.close()
fout.close()

0

পাইথন 3 পাথলিব লাইব্রেরি ব্যবহার করে :

import re
from pathlib import Path
import shutil

shutil.copy2("/tmp/test.xml", "/tmp/test.xml.bak") # create backup
filepath = Path("/tmp/test.xml")
content = filepath.read_text()
filepath.write_text(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>",r"<xyz>ABC</xyz>\1<xyz>\2</xyz>", content))

ব্যাকআপগুলিতে ভিন্ন পদ্ধতির ব্যবহার করে অনুরূপ পদ্ধতি:

from pathlib import Path

filepath = Path("/tmp/test.xml")
filepath.rename(filepath.with_suffix('.bak')) # different approach to backups
content = filepath.read_text()
filepath.write_text(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>",r"<xyz>ABC</xyz>\1<xyz>\2</xyz>", content))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.