Bewerken van specifieke regel in tekstbestand in Python

Stel dat ik een tekstbestand heb met:

Dan
Warrior
500
1
0

Is er een manier waarop ik een specifieke regel in dat tekstbestand kan bewerken? Op dit moment heb ik dit:

#!/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()

Ja, ik weet dat myfile.writelines('Mage')[1]onjuist is. Maar je snapt mijn punt, toch? Ik probeer regel 2 te bewerken door Warrior te vervangen door Mage. Maar kan ik dat zelfs?


Antwoord 1, autoriteit 100%

Je wilt zoiets als dit doen:

# 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 )

De reden hiervoor is dat je zoiets als “regel 2 wijzigen” niet rechtstreeks in een bestand kunt doen. U kunt alleen delen van een bestand overschrijven (niet verwijderen) – dat betekent dat de nieuwe inhoud alleen de oude inhoud dekt. Dus als je ‘Mage’ over regel 2 zou schrijven, zou de resulterende regel ‘Mageior’ zijn.


Antwoord 2, autoriteit 21%

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()

En dan:

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

Antwoord 3, autoriteit 19%

u kunt bestandsinvoer gebruiken om ter plaatse bewerkingen uit te voeren

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

Antwoord 4, autoriteit 10%

Je kunt het op twee manieren doen, kies wat het beste bij je past:

Methode I.)Vervangen met regelnummer. U kunt in dit geval de ingebouwde functie enumerate()gebruiken:

Eerst, in leesmodusalle gegevens in een variabele

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

Ten tweede, schrijf naar het bestand (waar enumeratetot actie komt)

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)

Methode II.)Gebruik het zoekwoord dat u wilt vervangen:

Open bestand in leesmodusen kopieer de inhoud naar een lijst

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.  

“Warrior” is vervangen door “Mage”, dus schrijf de bijgewerkte gegevens naar het bestand:

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

Dit is wat de outputin beide gevallen zal zijn:

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

Antwoord 5, autoriteit 2%

Als je tekst maar één persoon bevat:

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()

Als uw tekst meerdere personen bevat:

importeer opnieuw

# 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()

Als de “baan” van een persoon een constante lengte had in de tekst, zou je alleen het gedeelte van de tekst kunnen wijzigen dat overeenkomt met de “baan” van de gewenste persoon:
dat is hetzelfde idee als dat van Senderle.

Maar volgens mij zou het beter zijn om de kenmerken van individuen in een woordenboek op te nemen in een bestand met 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

Antwoord 6

Ik heb vanavond geoefend met het werken aan bestanden en realiseerde me dat ik op Jochens antwoord kan voortbouwen om meer functionaliteit te bieden voor herhaald/meervoudig gebruik. Helaas gaat mijn antwoord niet over het omgaan met grote bestanden, maar maakt het het leven in kleinere bestanden wel gemakkelijker.

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))

Antwoord 7

eerste gegevens schrijven, druk een lege straf om deze bij te werken naar nieuwe gegevens
hier voegen we een lege strin de laatste regel van de code, deze code kan worden gebruikt in interative update, met andere woorden het toevoegen van data in text.txtbestand

with open("data.txt", 'w') as f:
    f.write('first line\n'
            'second line\n'
            'third line\n'
            'fourth line\n'
            ' \n')

gegevens bijwerken in de laatste regel van het tekstbestand

my_file=open('data.txt')
string_list = my_file.readlines()
string_list[-1] = "Edit the list of strings as desired\n"
my_file = open("data.txt", "w")
new_file_contents = "". join(string_list)
my_file. write(new_file_contents)

Antwoord 8

Stel dat ik een bestand heb met de naam file_nameals volgt:

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

We moeten regel 2 vervangen door “modification is done”:

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

Antwoord 9

#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)

Antwoord 10

Dit is de gemakkelijkste manier om dit te doen.

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

Ik hoop dat het voor u zal werken.

Other episodes