如果下一行包含特定字符串,则在文件的新行中添加字符串

Adding string in new line of file if next line contains a specific string

我已经尝试了不同的解决方案来解决这个问题,但是 none 的解决方案有效并且太乱了 post 在这里。所以我只会提出我的问题。我有一个 .txt 文件,如下所示:

Field1:
Something
Field2:
Something
Field3:
Field4:
Field1:
Something
Field2:
Field3:
Something
Field4:
Something
...

该文件包含 4 个字段,这些字段自身重复次数不详,但始终以 Field4 结尾。每个字段下面都有一个字符串,或者没有。一个字段下面是否写有内容也是随机的。如果没有,我必须在下面插入一个字符串 "Empty"。所以最后它应该看起来像这样:

Field1:
Something
Field2:
Something
Field3:
Empty
Field4:
Empty
Field1:
Something
Field2:
Empty
Field3:
Something
Field4:
Something
...

我的想法是将原始文本文件打开为可读,将另一个文本文件打开为可写,遍历原始文件的行并将每一行写入输出文件。如果一行包含 Field1 并且下一行包含 Field2,则在 Field1 下面添加字符串 Empty 并继续对每一行执行此操作。

由于无法在中间编辑文本文件,因此程序会读取 readable.txt 中的每一行,并将它们附加到 writable.txt 并加上更正的行。

file = open("readable.txt","r")
file = file.readlines()
f = open("writable.txt", "a") 
n = 0

while n < len(file):
   if "Field" in file[n]:
       f.write(str(file[n]))

       if "Field" in file[n + 1]:
           f.write("Empty\n") 
           n = n + 1 
           continue
       else:
           f.write(file[n + 1]) 
           n = n + 1 
           continue
   else:
       n = n + 1
       continue

file.close()
f.close()

如果你有一个大文件,你不想在处理它之前把它全部读入内存,所以你可以这样做line-by-line。

首先,我们可以定义一个正则表达式 pattern 来匹配单词 "Field",后跟任意数量的数字,然后是冒号。 Try the regex

每次你读一行,如果前一行匹配这个模式,当前行也匹配这个模式,你在写这行之前写一个"Empty"。如果没有,你只需要写这行:

import re

pattern = re.compile(r"Field\d+:")  # Field, followed by one or more digits (\d+), and a colon

with open("in.txt") as infile, open("out.txt", "w") as outfile:
    prev_line = ""
    for line in infile:
        if pattern.match(line) and pattern.match(prev_line):
            outfile.write("Empty\n") # Write an Empty line if both lines match the pattern:

        outfile.write(line) # This is outside an if because we always write the current line
        prev_line = line

对于您的输入文件,这会给出:

Field1:
Something
Field2:
Something
Field3:
Empty
Field4:
Empty
Field1:
Something
Field2:
Empty
Field3:
Something
Field4:
Something