Python 在不包含字符串的行后打印x行

Python 在不包含字符串的行后打印x行,python,text,Python,Text,我试图压缩一个大文件,我需要消除不包含特定模式的行。但是,我还需要在“not pattern”行之后将一定限制的行保存到新文件中,并继续读取文件的每一行,以找到新的“not pattern”行 例如,要恢复每个“非模式行”后的前2条记录,输入文件如下所示: 146587678080980 1789dsdss809809 ABC1 1898fdfdf908908 ABC2 1789798709fdb80 ABC3 798789789767567 ABC4 798787576567577

我试图压缩一个大文件,我需要消除不包含特定模式的行。但是,我还需要在“not pattern”行之后将一定限制的行保存到新文件中,并继续读取文件的每一行,以找到新的“not pattern”行

例如,要恢复每个“非模式行”后的前2条记录,输入文件如下所示:

146587678080980

1789dsdss809809 ABC1

1898fdfdf908908 ABC2

1789798709fdb80 ABC3

798789789767567 ABC4

798787576567577

178990809809809 ABC7

189890sf908908f ABC8

178979ggggf9080 ABC9

18098rrttty0980 ABC10

1mkklnklnlknlkn ABC17
输出文件应为:

1789dsdss809809 ABC1

1898fdfdf908908 ABC2

178990809809809 ABC7

189890sf908908f ABC8
到目前为止,我已尝试此代码,但未成功:

limit = 2

with open('input.txt') as oldfile, open('output.txt') as newfile: 
    for line in oldfile:
        if not ('ABC'):
            line_count = 0
            if line_count <= limit:
               newfile.write(line)
            line_count += 1
limit=2
打开('input.txt')作为旧文件,打开('output.txt')作为新文件:
对于旧文件中的行:
如果不是(“ABC”):
行计数=0

如果line_count这里有一种方法与您的示例类似:

limit = 2
with open('input.txt') as ifh, open('output.txt', 'w') as ofh:
    ctr = 0
    for line in ifh:
        if not 'ABC' in line:
            ctr = 0
        else:
            if ctr < limit:
                ctr += 1
                ofh.write(line)

将输入文件设置为:

146587678080980

1789dsdss809809 ABC1

1898fdfdf908908 ABC2

1789798709fdb80 ABC3

798789789767567 ABC4

798787576567577

178990809809809 ABC7

189890sf908908f ABC8

178979ggggf9080 ABC9

18098rrttty0980 ABC10

1mkklnklnlknlkn ABC17
首先打开文件并去除空行,将包含内容的行保存到行列表中:

以open('input.txt','r')作为f的
:
如果len(line.strip('\n'))>0,则in_lines=[line.strip('\n')表示f.readlines()中的行
然后运行所有行以查找“非模式行”ID,并扩展一个空的输出行列表,其中的行在当前“非模式行”索引之后达到限制

out\u line=list()
极限=2
对于idx,枚举中的行(行中):
如果“ABC”不一致:
向外延伸(向内延伸[(idx+1:(idx+1+限制)])
要获取与输入格式相同的输出文件,请执行以下操作:

打开('output.txt',w')作为f的
:
f、 写入线('\n\n'.连接(输出线))
结果
output.txt
应该是:

1789dsdss809809 ABC1

1898fdfdf908908 ABC2

178990809809809 ABC7

189890sf908908f ABC8

您需要跟踪两个状态:

  • 一个用于查找非模式线
  • 一个用于捕获非图案线之后的线(达到一定限制)
limit=2
将open('input.txt','r')作为旧文件,将open('output.txt','w')作为新文件:
_=False吗
对于旧文件中的行:
如果不是line.strip():
忽略空行,不要认为它们是非模式。
持续
elif不符合“ABC”且不符合以下条件:
#国家1
#找到非模式行的开始('ABC'不在行中)
#启用状态以捕获下一行
_=True吗
行计数=0
elif是捕获和行计数<限制:
#国家2
#在非图案线之后捕获一定数量的线
newfile.write(行)
行计数+=1
其他:
#重置状态
_=False吗
输出文件应包含:

1789dsdss809809 ABC1
1898fdfdf908908 ABC2
178990809809809 ABC7
189890sf908908f ABC8
如果还需要保存“非模式”行,请将其添加到状态1:

elif不在行中且不在捕获中:
#国家1
#找到非模式行的开始('ABC'不在行中)
#启用状态以捕获下一行
newfile.write(行)
_=True吗
行计数=0
如果要保留每个写入行之间的空行,请执行以下操作:

newfile.write(第+'\n'行)

什么是
输入文件
输出文件
?因为文件对象是不可下标的,并且没有扩展方法。
1789dsdss809809 ABC1

1898fdfdf908908 ABC2

178990809809809 ABC7

189890sf908908f ABC8
1789dsdss809809 ABC1
1898fdfdf908908 ABC2
178990809809809 ABC7
189890sf908908f ABC8