Editing specific line in text file in Python

Let's say I have a text file containing:

Dan
Warrior
500
1
0

Is there a way I can edit a specific line in that text file? Right now I have this:

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

Yes, I know that myfile.writelines('Mage')[1] is incorrect. But you get my point, right? I'm trying to edit line 2 by replacing Warrior with Mage. But can I even do that?

279629 次浏览

You want to do something like this:

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

原因是您不能直接在文件中执行“ change line 2”之类的操作。您只能覆盖(而不是删除)文件的一部分-这意味着新的内容只覆盖旧的内容。因此,如果在第2行上写“ Mage”,得到的行将是“ Mageior”。

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

您可以使用文件输入在适当的位置进行编辑

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

如果你的文本只包含一个人:

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

If your text contains several individuals:

进口再生

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

如果一个人的“工作”在文本中是固定长度的,你只能改变文本中与“工作”相对应的部分: 和 Senderle 的想法一样。

但我认为,更好的做法是将个体的特征记录在 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

你可以有两种方法,选择适合你需要的:

方法 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) 使用要替换的关键字:

Open file in 读取模式 and copy the contents to a list

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

今天晚上,我一直在练习处理文件,并意识到我可以在 Jochen 的答案基础上提供更大的重复/多重使用功能。不幸的是,我的回答并没有解决处理大文件的问题,而是使处理小文件更容易。

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

假设我有一个名为 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
#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)

这是最简单的方法。

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

我希望这对你有用。

写入初始数据,打印一个空的 str以便将其更新为新数据 这里我们在代码的最后一行插入一个空的 str,这个代码可以用于交互式更新,换句话说,在 text.txt文件中追加数据

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

updating data in the last line of the text file

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)

我以前也有过同样的要求最终我选择了金贾模板。将你的文本文件更改为下面的,并且使用一个变量 lastname,然后你可以通过传递 lastname='Meg'来呈现模板,这是我能想到的最有效和最快的方法。

Dan
\{\{ lastname }}
Warrior
500
1
0