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