在Python中编辑文本文件中的特定行
假设我有一个文本文件,其中包含:在Python中编辑文本文件中的特定行,python,io,Python,Io,假设我有一个文本文件,其中包含: Dan 战士 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') myfi
Dan
战士
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行。但是我可以这样做吗?你想做这样的事情:
# 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”
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')
您可以使用fileinput进行就地编辑
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()
如果您的文本包含多个人:
进口稀土
# 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
您可以通过两种方式完成,选择适合您需求的方式: 方法一)使用行号替换。在这种情况下,可以使用内置函数
enumerate()
:
首先,在读取模式下获取变量中的所有数据
with open("your_file.txt",'r') as f:
get_all=f.readlines()
第二,写入文件(其中,枚举起作用)
方法二。)使用要替换的关键字:
以读取模式打开文件并将内容复制到列表中
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\u name
的文件,如下所示:
this is python
it is file handling
this is editing of line
我们必须将2号线替换为“修改完成”:
这是最简单的方法
fin = open("a.txt")
f = open("file.txt", "wt")
for line in fin:
f.write( line.replace('foo', 'bar') )
fin.close()
f.close()
我希望它能对你有用。我认为这篇文章涵盖了你要找的内容:如果你必须经常做这类事情,你可能想把这个文件从文本转换成类似bdb或其他类似bdb的东西。这会将整个文件的内容加载到内存中,如果文件很大,这可能不是一件好事。@SteveNg do yo你有办法解决你注意到的问题吗?这个答案和公认的答案都依赖于在memoryHi Jochen中加载整个文件,即语句“with open(filename,mode)”也会在程序退出后隐式关闭文件名,对吗?@Gabriel Thx,这一点需要注意,尽管我仍然不使用with…as file语句。Pythonic与否,我不喜欢:)@Radu这是一个习惯的问题。我也曾经通过
close手动关闭打开的文件。
但现在我看到使用with
块更干净。假设这是小文件首选的解决方案是否正确?否则,我们可能需要大量内存来存储数据。此外,即使是一次编辑,我们也需要重新写入整个内容。糟糕..如果您有20 Gb的文件怎么办?欢迎使用堆栈溢出!请注意,您回答的是一个非常旧且已回答的问题问题。这是一个关于@ajay jaiswal的指南。请指定您的问题,并提供一个最小的可复制示例以及您收到的任何错误消息。您发布了代码,但不是实际的问题。
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)
fin = open("a.txt")
f = open("file.txt", "wt")
for line in fin:
f.write( line.replace('foo', 'bar') )
fin.close()
f.close()