পাইথনে টেক্সট ফাইলে নির্দিষ্ট লাইন সম্পাদনা করা


88

ধরা যাক আমার কাছে একটি পাঠ্য ফাইল রয়েছে:

Dan
Warrior
500
1
0

সেই পাঠ্য ফাইলে একটি নির্দিষ্ট লাইন সম্পাদনা করার কোনও উপায় আছে কি? এই মুহূর্তে আমার কাছে এটি রয়েছে:

#!/usr/bin/env python
import io

myfile = open('stats.txt', 'r')
dan = myfile.readline()
print dan
print "Your name: " + dan.split('\n')[0]

try:
    myfile = open('stats.txt', 'a')
    myfile.writelines('Mage')[1]
except IOError:
        myfile.close()
finally:
        myfile.close()

হ্যাঁ, আমি জানি এটি myfile.writelines('Mage')[1]ভুল। তবে আপনি আমার বক্তব্য আছে, তাই না? আমি ওয়ারেয়ারকে ম্যাজেজ দ্বারা প্রতিস্থাপন করে লাইন 2 সম্পাদনার চেষ্টা করছি। তবে আমি কি তাও করতে পারি?


4
আমি মনে করি এই পোস্টটি আপনি যা খুঁজছেন তা কভার করেছে: stackoverflow.com/questions/1998233/…
কাইল ওয়াইল্ড

4
যদি আপনাকে এই ধরণের জিনিসটি অনেক কিছু করতে হয় তবে আপনি এই ফাইলটিকে পাঠ্য থেকে বিডিবি বা অন্যান্য বিডিবি-এর মতো কিছুতে রূপান্তর করতে চাইতে পারেন।
নিক বেস্টিন

উত্তর:


125

আপনি এরকম কিছু করতে চান:

# with is like your try .. finally block in this case
with open('stats.txt', 'r') as file:
    # read a list of lines into data
    data = file.readlines()

print data
print "Your name: " + data[0]

# now change the 2nd line, note that you have to add a newline
data[1] = 'Mage\n'

# and write everything back
with open('stats.txt', 'w') as file:
    file.writelines( data )

এর কারণ হ'ল আপনি সরাসরি কোনও ফাইলে "পরিবর্তন লাইন 2" এর মতো কিছু করতে পারবেন না। আপনি কেবল কোনও ফাইলের অংশগুলি ওভাররাইট করতে (মুছতে পারেন না) - এর অর্থ এই যে নতুন সামগ্রীটি কেবল পুরানো সামগ্রীকে কভার করে। সুতরাং, আপনি যদি 'Mage' ওভার লাইন 2 লিখেন, ফলস্বরূপ লাইনটি 'ম্যাজিয়ের' হবে।


4
হাই জোচেন, "ওপেন (ফাইলের নাম, মোড) সহ" বিবৃতিটি ফাইলের নামটি প্রোগ্রামের বাইরে চলে যাওয়ার পরেও পুরোপুরি বন্ধ করে দিয়েছে, তাই না?
রাদু

@ গ্যাব্রিয়েল থেক্স, এটি লক্ষ করা গুরুত্বপূর্ণ, যদিও আমি এখনও ফাইল বিবৃতি হিসাবে ... ব্যবহার করি না। পাইথোনিক বা না, আমি এটি পছন্দ করি না :)
রাদু

@ রাদু এটির অভ্যস্ত হওয়ার বিষয়। আমি খোলা ফাইলগুলি ম্যানুয়ালিও বন্ধ করে close.দিতাম তবে এখন দেখছি যে withব্লক ব্যবহার করা অনেক বেশি পরিষ্কার er
গ্যাব্রিয়েল

4
অনুমান করা কি সঠিক, এটি ছোট ফাইলগুলির জন্য পছন্দসই একটি সমাধান? অন্যথায় আমাদের কেবলমাত্র তথ্য সংরক্ষণের জন্য প্রচুর স্মৃতি দরকার। তদ্ব্যতীত, এমনকি 1 সম্পাদনার জন্য, আমাদের আবার পুরো জিনিসটি লিখতে হবে।
অরিন্দম রায়চৌধুরী

11
খারাপ .. আপনার যদি 20 জিবি ফাইল থাকে?
ব্রান্স ডিএস

21

আপনি স্থান সম্পাদনা করতে ফাইল ইনপুট ব্যবহার করতে পারেন

import fileinput
for  line in fileinput.FileInput("myfile", inplace=1):
    if line .....:
         print line

19
def replace_line(file_name, line_num, text):
    lines = open(file_name, 'r').readlines()
    lines[line_num] = text
    out = open(file_name, 'w')
    out.writelines(lines)
    out.close()

এবং তারপর:

replace_line('stats.txt', 0, 'Mage')

9
এটি পুরো ফাইলের সামগ্রীটি মেমোরিতে লোড করবে যা ফাইল বিশাল হলে ভাল জিনিস নাও হতে পারে।
স্টিভ এনজি

@ স্টেভএনজি আপনার কাছে যে সমস্যার বিষয়টি লক্ষ্য করেছেন তা সমাধান করার কি আপনার কি সমাধান আছে? এই উত্তর এবং গৃহীত উভয়ই মেমরির পুরো ফাইলটি লোড করার উপর নির্ভর করে
ব্লুপন

14

আপনি এটি দুটি উপায়ে করতে পারেন, আপনার প্রয়োজনীয়তার জন্য উপযুক্ত কি তা চয়ন করুন:

পদ্ধতি I.) লাইন নম্বর ব্যবহার করে প্রতিস্থাপন। আপনি enumerate()এই ক্ষেত্রে অন্তর্নির্মিত ফাংশনটি ব্যবহার করতে পারেন :

প্রথমে, পঠন মোডে ভেরিয়েবলের সমস্ত ডেটা পান

with open("your_file.txt",'r') as f:
    get_all=f.readlines()

দ্বিতীয়ত, ফাইলটিতে লিখুন (যেখানে গণনা কার্যকর হবে )

with open("your_file.txt",'w') as f:
    for i,line in enumerate(get_all,1):         ## STARTS THE NUMBERING FROM 1 (by default it begins with 0)    
        if i == 2:                              ## OVERWRITES line:2
            f.writelines("Mage\n")
        else:
            f.writelines(line)

পদ্ধতি II।) আপনি যে কীওয়ার্ডটি প্রতিস্থাপন করতে চান তা ব্যবহার করে:

পঠন মোডে ফাইল খুলুন এবং লিখিত বিষয়বস্তু অনুলিপি করুন

with open("some_file.txt","r") as f:
    newline=[]
    for word in f.readlines():        
        newline.append(word.replace("Warrior","Mage"))  ## Replace the keyword while you copy.  

"ওয়ারিয়র" "ম্যাজ" দ্বারা প্রতিস্থাপিত হয়েছে, সুতরাং ফাইলটিতে আপডেট করা ডেটা লিখুন:

with open("some_file.txt","w") as f:
    for line in newline:
        f.writelines(line)

উভয় ক্ষেত্রেই এটাই আউটপুট হবে:

Dan                   Dan           
Warrior   ------>     Mage       
500                   500           
1                     1   
0                     0           

3

যদি আপনার পাঠ্যটিতে একটি মাত্র ব্যক্তি থাকে:

import re

# creation
with open('pers.txt','wb') as g:
    g.write('Dan \n Warrior \n 500 \r\n 1 \r 0 ')

with open('pers.txt','rb') as h:
    print 'exact content of pers.txt before treatment:\n',repr(h.read())
with open('pers.txt','rU') as h:
    print '\nrU-display of pers.txt before treatment:\n',h.read()


# treatment
def roplo(file_name,what):
    patR = re.compile('^([^\r\n]+[\r\n]+)[^\r\n]+')
    with open(file_name,'rb+') as f:
        ch = f.read()
        f.seek(0)
        f.write(patR.sub('\\1'+what,ch))
roplo('pers.txt','Mage')


# after treatment
with open('pers.txt','rb') as h:
    print '\nexact content of pers.txt after treatment:\n',repr(h.read())
with open('pers.txt','rU') as h:
    print '\nrU-display of pers.txt after treatment:\n',h.read()

যদি আপনার পাঠ্যে বেশ কয়েকটি ব্যক্তি থাকে:

আমদানি পুনরায়

# creation
with open('pers.txt','wb') as g:
    g.write('Dan \n Warrior \n 500 \r\n 1 \r 0 \n Jim  \n  dragonfly\r300\r2\n10\r\nSomo\ncosmonaut\n490\r\n3\r65')

with open('pers.txt','rb') as h:
    print 'exact content of pers.txt before treatment:\n',repr(h.read())
with open('pers.txt','rU') as h:
    print '\nrU-display of pers.txt before treatment:\n',h.read()


# treatment
def ripli(file_name,who,what):
    with open(file_name,'rb+') as f:
        ch = f.read()
        x,y = re.search('^\s*'+who+'\s*[\r\n]+([^\r\n]+)',ch,re.MULTILINE).span(1)
        f.seek(x)
        f.write(what+ch[y:])
ripli('pers.txt','Jim','Wizard')


# after treatment
with open('pers.txt','rb') as h:
    print 'exact content of pers.txt after treatment:\n',repr(h.read())
with open('pers.txt','rU') as h:
    print '\nrU-display of pers.txt after treatment:\n',h.read()

যদি কোনও ব্যক্তির "কাজ" টেক্সটটিতে একটি ধ্রুবক দৈর্ঘ্যের হয়, আপনি কেবলমাত্র "চাকরি" পছন্দসই ব্যক্তির সাথে সম্পর্কিত টেক্সটের অংশটি পরিবর্তন করতে পারেন: এটি প্রেরকের মতো একই ধারণা।

তবে আমার মতে সিপিকেলের সাথে ফাইলের মধ্যে রেকর্ড করা একটি স্বতন্ত্র ব্যক্তির বৈশিষ্ট্যগুলি রাখাই ভাল better

from cPickle import dump, load

with open('cards','wb') as f:
    dump({'Dan':['Warrior',500,1,0],'Jim':['dragonfly',300,2,10],'Somo':['cosmonaut',490,3,65]},f)

with open('cards','rb') as g:
    id_cards = load(g)
print 'id_cards before change==',id_cards

id_cards['Jim'][0] = 'Wizard'

with open('cards','w') as h:
    dump(id_cards,h)

with open('cards') as e:
    id_cards = load(e)
print '\nid_cards after change==',id_cards

2

আমি আজ সন্ধ্যায় ফাইলগুলিতে কাজ করার অনুশীলন করেছি এবং বুঝতে পেরেছি যে পুনরাবৃত্তি / একাধিক ব্যবহারের জন্য আরও বেশি কার্যকারিতা সরবরাহ করার জন্য জোচেনের উত্তরটি তৈরি করতে পারি। দুর্ভাগ্যক্রমে আমার উত্তরটি বড় ফাইলগুলির সাথে ডিল করার বিষয়টি বিবেচনা করে না তবে ছোট ফাইলগুলিতে জীবনকে সহজ করে তোলে।

with open('filetochange.txt', 'r+') as foo:
    data = foo.readlines()                  #reads file as list
    pos = int(input("Which position in list to edit? "))-1  #list position to edit
    data.insert(pos, "more foo"+"\n")           #inserts before item to edit
    x = data[pos+1]
    data.remove(x)                      #removes item to edit
    foo.seek(0)                     #seeks beginning of file
    for i in data:
        i.strip()                   #strips "\n" from list items
        foo.write(str(i))

0

এটি করার সহজ উপায় এটি।

fin = open("a.txt")
f = open("file.txt", "wt")
for line in fin:
    f.write( line.replace('foo', 'bar') )
fin.close()
f.close()

আমি আশা করি এটি আপনার পক্ষে কাজ করবে।


-1
#read file lines and edit specific item

file=open("pythonmydemo.txt",'r')
a=file.readlines()
print(a[0][6:11])

a[0]=a[0][0:5]+' Ericsson\n'
print(a[0])

file=open("pythonmydemo.txt",'w')
file.writelines(a)
file.close()
print(a)

4
স্ট্যাক ওভারফ্লোতে স্বাগতম! আপনি একটি খুব পুরানো এবং ইতিমধ্যে উত্তর প্রশ্নের উত্তর দিচ্ছেন দয়া করে নোট করুন। কীভাবে উত্তর দেবেন সে সম্পর্কে এখানে একটি গাইড রয়েছে ।
help-info.de

@ অজয়-জয়সওয়াল দয়া করে আপনার প্রশ্নটি নির্দিষ্ট করুন এবং একটি ন্যূনতম প্রজননযোগ্য উদাহরণ এবং আপনি যে কোনও ত্রুটি বার্তা পাচ্ছেন তা সরবরাহ করুন। আপনি কোড পোস্ট করেছেন তবে আসল প্রশ্ন নয়।
দিমিত্রিও

-2

ধরুন আমার কাছে file_nameনীচের মতো একটি ফাইল রয়েছে :

this is python
it is file handling
this is editing of line

আমাদের "লাইন পরিবর্তন হয়েছে" এর সাথে লাইন 2 প্রতিস্থাপন করতে হবে:

f=open("file_name","r+")
a=f.readlines()
for line in f:
   if line.startswith("rai"):
      p=a.index(line)
#so now we have the position of the line which to be modified
a[p]="modification is done"
f.seek(0)
f.truncate() #ersing all data from the file
f.close()
#so now we have an empty file and we will write the modified content now in the file
o=open("file_name","w")
for i in a:
   o.write(i)
o.close()
#now the modification is done in the file
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.