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

2024-09-29 01:29:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文本文件,如下所示:

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)

这对我有用,但看起来很难看。


Tags: andtxtiflinenotoutfilewriteflag
3条回答

回想一下迭代器是一类对象。它可以在多个for语句中使用。

这里有一种方法来处理这个问题,而不需要很多复杂的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()

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

相关问题 更多 >