如何在Python中写入特定行的文件?

6

我有一个文件,格式如下:

xxxxx
yyyyy
zzzzz
ttttt

我需要在xxxxx和yyyyy行之间写入文件:

xxxxx
my_line
yyyyyy
zzzzz
ttttt 

2
在Python中搜索并替换文件中的一行 - Grijesh Chauhan
如何逐行替换(更新)文件中的文本 - Grijesh Chauhan
1
你目前尝试了什么?如果你还没有尝试过,我建议先阅读有关打开文件的内容。 - oathead
@GrijeshChauhan -- 这并不是完全的替换,而是插入,这是稍微不同的。 - mgilson
@mgilson,我认为这会有所帮助...因为OP将他的问题发布为要求,但没有解释他遇到了什么问题...这就是我评论链接而不是回答的原因。 - Grijesh Chauhan
2个回答

4
with open('input') as fin, open('output','w') as fout:
    for line in fin:
        fout.write(line)
        if line == 'xxxxx\n':
           next_line = next(fin)
           if next_line == 'yyyyy\n':
              fout.write('my_line\n')
           fout.write(next_line)

这将在文件中每个xxxxx\nyyyyy\n之间插入您的行。

另一种方法是编写一个函数,可以产生行,直到它看到一个xxxxx\nyyyyy\n为止。

 def getlines(fobj,line1,line2):
     for line in iter(fobj.readline,''):  #This is necessary to get `fobj.tell` to work
         yield line
         if line == line1:
             pos = fobj.tell()
             next_line = next(fobj):
             fobj.seek(pos)
             if next_line == line2:
                 return

然后您可以直接将其传递给 writelines
with open('input') as fin, open('output','w') as fout:
    fout.writelines(getlines(fin,'xxxxx\n','yyyyy\n'))
    fout.write('my_line\n')
    fout.writelines(fin)

2
@GrijeshChauhan -- 是的,当使用ASCII进行操作时,如果你想就地进行这些操作,那么就相当困难,除非你将整个文件读入内存...但即使这样做,它也不是真正的就地操作。你只是将整个文件读入内存,并在具有相同文件名的位置写回。 - mgilson
@mgilson:使用for line in iter(fin.readline,''):代替,.tell()将再次正确。 :-) - Martijn Pieters
@MartijnPieters -- 是的,但那很丑...也许使用itertools.takewhile和Python 3.3的yield from会更好... yield from it.takewhile(lambda x: x == 'xxxxx\n' or x == '',fobj) 然后只需yield line1,如果下一行不等于line2则重复... - mgilson
@mgilson:我开始使用it.takewhile解决这个问题,但由于它只是在文件中进行迭代,所以我意识到ftell()的不一致性。 - Abhijit
@mgilson:我忽略了你是在文本模式下打开文件的这个事实 :-) - Abhijit
显示剩余10条评论

3
如果文件很小,那么你可以简单地使用 str.replace():
>>> !cat abc.txt
xxxxx
yyyyy
zzzzz
ttttt

>>> with open("abc.txt") as f,open("out.txt",'w') as o:
    data=f.read()
    data=data.replace("xxxxx\nyyyyy","xxxxx\nyourline\nyyyyy")
    o.write(data)
   ....:     

>>> !cat out.txt
xxxxx
yourline
yyyyy
zzzzz
ttttt

对于大文件,请使用mgilson的方法。

2
人们在Python上不会无助...我的意思是,如果你在那里的话 ;) - Grijesh Chauhan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接