如果下一行包含特定字符串,则在文件的新行中添加字符串
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
我已经尝试了不同的解决方案来解决这个问题,但是 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