我有一个文本文件,如下所示:
blah blah
foo1 bar1
foo1 bar2
foo1 bar3
foo2 bar4
foo2 bar5
blah blah
现在我想在'foo1 bar3'
和'foo2 bar4'
之间插入'foo bar'
。
我就是这样做的:
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)
这对我有用,但看起来很难看。
回想一下迭代器是一类对象。它可以在多个for语句中使用。
这里有一种方法来处理这个问题,而不需要很多复杂的if语句和标志。
对Python中的文件进行“伪就地”更改的最佳方法是使用标准库中的
fileinput
模块:如果希望保留旧版本,也可以指定备份扩展,但这与代码的工作方式相同--使用
.bak
作为备份扩展,但在更改成功完成后也会将其删除。除了使用正确的标准库模块外,这段代码还使用了更简单的逻辑:要在每次以
foo1
开头的行运行之后插入"foo bar"
行,您只需要一个布尔值(我是否在这样的运行中?)所讨论的bool可以无条件地设置,仅仅基于当前行是否以这种方式开始。如果您想要的精确逻辑与此逻辑(这是我从您的代码中推断出来的)略有不同,那么相应地调整此代码应该不难。改编Alex Martelli的例子:
相关问题 更多 >
编程相关推荐