在文本文件的指定位置插入行

我有一个文本文件,看起来像这样:

blah blah foo1 bar1 foo1 bar2 foo1 bar3 foo2 bar4 foo2 bar5 blah blah 

现在我想在'foo1 bar3''foo2 bar4'之间插入'foo bar' 'foo2 bar4'

这是我做到的:

 import shutil txt = '1.txt' tmptxt = '1.txt.tmp' with open(tmptxt, 'w') as outfile: with open(txt, 'r') as infile: flag = 0 for line in infile: if not line.startswith('foo1') and flag == 0: outfile.write(line) continue if line.startswith('foo1') and flag == 0: flag = 1 outfile.write(line) continue if line.startswith('foo1') and flag == 1: outfile.write(line) continue if not line.startswith('foo1') and flag == 1: outfile.write('foo bar\n') outfile.write(line) flag = 2 continue if not line.startswith('foo1') and flag == 2: outfile.write(line) continue shutil.move(tmptxt, txt) 

这适用于我,但看起来相当丑陋。

在Python中对文件进行“伪置换”更改的最佳方法是使用标准库中的fileinput模块:

 import fileinput processing_foo1s = False for line in fileinput.input('1.txt', inplace=1): if line.startswith('foo1'): processing_foo1s = True else: if processing_foo1s: print 'foo bar' processing_foo1s = False print line, 

如果要保留旧版本,也可以指定备份扩展名,但是这与您的代码保持一致 – 使用.bak作为备份扩展名,但是也可以在更改成功完成后将其删除。

除了使用正确的标准库模块外,这段代码还使用了更简单的逻辑:在每一行以foo1开头的行之后插入一个"foo bar"行,所有你需要的布尔值(我是否在这样的一个运行中?有问题的bool可以根据当前行是否以这种方式开始无条件设置。 如果你想要的精确的逻辑与这个(这是我从你的代码中推导出来的)稍有不同,那么相应地调整这个代码应该不难。

改编Alex Martelli的例子:

 import fileinput for line in fileinput.input('1.txt', inplace=1): print line, if line.startswith('foo1 bar3'): print 'foo bar' 

回想一下,迭代器是第一类对象。 它可以用于多个语句。

这里有一个方法来处理这个没有很多复杂的if语句和标志。

 with open(tmptxt, 'w') as outfile: with open(txt, 'r') as infile: rowIter= iter(infile) for row in rowIter: if row.startswith('foo2'): # Start of next section break print row.rstrip(), repr(row) print "foo bar" print row for row in rowIter: print row.rstrip()