पायथन में पाठ फ़ाइल में विशिष्ट पंक्ति का संपादन


86

मान लें कि मेरे पास एक टेक्स्ट फ़ाइल है:

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 लाइन को संपादित करने की कोशिश कर रहा हूं। लेकिन क्या मैं भी ऐसा कर सकता हूं?


1
मुझे लगता है कि यह पोस्ट आपके लिए क्या देख रही है: stackoverflow.com/questions/1998233/…
Kyle Wild

1
अगर आपको इस तरह की चीज़ करनी है, तो आप इस फाइल को टेक्स्ट से bdb या अन्य bdb-alike जैसी किसी चीज़ में परिवर्तित करना चाहते हैं।
निक बैस्टिन

जवाबों:


123

आप ऐसा कुछ करना चाहते हैं:

# 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" जैसा कुछ नहीं कर सकते हैं। आप किसी फ़ाइल के कुछ हिस्सों को केवल हटा सकते हैं (हटाएं नहीं) - इसका मतलब है कि नई सामग्री में पुरानी सामग्री शामिल है। इसलिए, यदि आपने पंक्ति 2 के ऊपर 'Mage' लिखा है, तो परिणामी रेखा 'Mageior' होगी।


2
हाय जोचेन, बयान "ओपन (फ़ाइलनाम, मोड) के साथ" भी कार्यक्रम से बाहर निकलने के बाद फ़ाइल नाम को बंद कर देता है, है ना?
रादु

@ गैब्रिएल Thx, यह नोट करना महत्वपूर्ण है, हालांकि मैं अभी भी फ़ाइल विवरण के साथ ... का उपयोग नहीं करता हूं। Pythonic या नहीं, मैं नहीं यह कैसा :) करना
राडू

@Radu इसका उपयोग करने की बात है। मैं मैन्युअल रूप से खोली गई फ़ाइलों को भी बंद कर देता था, close.लेकिन अब मैं देखता हूं कि withब्लॉक का उपयोग करना ज्यादा साफ है।
गेब्रियल

5
क्या यह मान लेना सही है, यह छोटी फ़ाइलों के लिए पसंदीदा समाधान है? अन्यथा हमें केवल डेटा संग्रहीत करने के लिए बहुत अधिक मेमोरी की आवश्यकता हो सकती है। इसके अलावा, यहां तक ​​कि 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
यह संपूर्ण फ़ाइल की सामग्री को मेमोरी में लोड कर देगा जो फ़ाइल के विशाल होने पर अच्छी बात नहीं हो सकती है।
स्टीव एनजी

@SteveNg क्या आपके पास आपके द्वारा देखी गई समस्या का समाधान है? यह उत्तर और स्वीकृत दोनों पूरी फ़ाइल को मेमोरी में लोड करने पर निर्भर करते हैं
ब्लूपन

13

आप इसे दो तरीकों से कर सकते हैं, अपनी आवश्यकता के अनुसार क्या चुनें:

विधि 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()

यदि किसी व्यक्ति का "काम" टेक्सटे में एक निरंतर लंबाई का था, तो आप वांछित व्यक्ति के "टेक्स" के अनुरूप केवल टेक्स के हिस्से को बदल सकते हैं: यह वही है जो प्रेषक के समान है।

लेकिन मेरे अनुसार, बेहतर होगा कि आप लोगों की विशेषताओं को cPickle के साथ फाइल में दर्ज एक डिक्शनरी में रखें:

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

# फ़ाइल लाइनों को फैलाएं और विशिष्ट आइटम को संपादित करें

फ़ाइल = खुला ( "pythonmydemo.txt", 'आर')

एक = file.readlines ()

प्रिंट (एक [0] [06:11])

एक [0] = एक [०] [०: ५] + 'एरिक्सन \ n'

प्रिंट (एक [0])

फ़ाइल = खुला ( "pythonmydemo.txt", 'मौ')

file.writelines (क)

file.close ()

प्रिंट (क)


1
ढेर अतिप्रवाह में आपका स्वागत है! कृपया ध्यान दें कि आप बहुत पुराने और पहले से ही उत्तर दिए गए प्रश्न का उत्तर दे रहे हैं। यहाँ कैसे उत्तर के लिए एक गाइड है ।
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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.