如何在 python 的连续行中找到数字模式?
how can a find a patter of numbers in consecutive lines with python?
我正在学习 python,但我的脚本还存在一些问题。
我有一个类似的文件:
1 5
2 5
3 5
4 2
5 1
6 7
7 7
8 8
我想在连续的行中打印数字对 2-1,只需在第 2 列中找到它们,然后将结果打印在第 1 列和第 2 列中。结果将类似于:
4 2
5 1
我正在尝试用 python 来完成,因为我的文件有 4,000,000 条数据。所以,这是我的脚本:
import linecache
final_lines = []
with open("file.dat") as f:
for i, line in enumerate(f, 1):
if "1" in line:
if "2" in linecache.getline("file.dat", i-1):
linestart = i - 1
final_lines.append(linecache.getline("file.dat", linestart))
print(final_lines)
结果是:
['2\n', '2\n', '2\n']
我必须在我的脚本中更改什么以适应我想要的结果?请你指导我好吗?非常感谢。
使用带有 enumerate
的 for 循环和 if
语句对行进行条件处理,然后如果条件为真,则将这两行追加到列表中 final_lines
:
final_lines = []
with open('file.dat') as f:
lines = f.readlines()
for i,line in enumerate(lines):
if line.split()[1] == '2' and lines[i+1].split()[1] == '1':
final_lines.extend([line,lines[i+1]])
现在:
print(final_lines)
会return你想要的列表。
我认为可以
import re
with open("info.dat") as f:
for match in re.findall("\d+ 2[\s\n]*\d+ 1",f.read()):
print match
另请参阅:https://repl.it/repls/TatteredViciousResources
另一种选择是
lines = f.readlines()
for line,nextline in zip(lines,lines[1:]):
if line.strip().endswith("2") and nextline.strip().endswith("1"):
print(line+nextline)
您是 Python 的初学者,这很好,所以我将采用更初级的方法。这是一个巨大的文件,因此您最好一次读取一行并只保留该行,但实际上您需要两行来识别模式,所以保留两行。考虑以下因素:
fp = open('file.dat')
last_line = fp.readline()
next_line = fp.readline()
while next_line:
# logic to split the lines into a pair
# of numbers and check to see if the
# 2 and 1 end last_line and next_line
# and outputting
last_line = next_line
next_line = fp.readline()
这遵循良好的、可读的软件模式,并且需要最少的资源。
我正在学习 python,但我的脚本还存在一些问题。
我有一个类似的文件:
1 5
2 5
3 5
4 2
5 1
6 7
7 7
8 8
我想在连续的行中打印数字对 2-1,只需在第 2 列中找到它们,然后将结果打印在第 1 列和第 2 列中。结果将类似于:
4 2
5 1
我正在尝试用 python 来完成,因为我的文件有 4,000,000 条数据。所以,这是我的脚本:
import linecache
final_lines = []
with open("file.dat") as f:
for i, line in enumerate(f, 1):
if "1" in line:
if "2" in linecache.getline("file.dat", i-1):
linestart = i - 1
final_lines.append(linecache.getline("file.dat", linestart))
print(final_lines)
结果是:
['2\n', '2\n', '2\n']
我必须在我的脚本中更改什么以适应我想要的结果?请你指导我好吗?非常感谢。
使用带有 enumerate
的 for 循环和 if
语句对行进行条件处理,然后如果条件为真,则将这两行追加到列表中 final_lines
:
final_lines = []
with open('file.dat') as f:
lines = f.readlines()
for i,line in enumerate(lines):
if line.split()[1] == '2' and lines[i+1].split()[1] == '1':
final_lines.extend([line,lines[i+1]])
现在:
print(final_lines)
会return你想要的列表。
我认为可以
import re
with open("info.dat") as f:
for match in re.findall("\d+ 2[\s\n]*\d+ 1",f.read()):
print match
另请参阅:https://repl.it/repls/TatteredViciousResources
另一种选择是
lines = f.readlines()
for line,nextline in zip(lines,lines[1:]):
if line.strip().endswith("2") and nextline.strip().endswith("1"):
print(line+nextline)
您是 Python 的初学者,这很好,所以我将采用更初级的方法。这是一个巨大的文件,因此您最好一次读取一行并只保留该行,但实际上您需要两行来识别模式,所以保留两行。考虑以下因素:
fp = open('file.dat')
last_line = fp.readline()
next_line = fp.readline()
while next_line:
# logic to split the lines into a pair
# of numbers and check to see if the
# 2 and 1 end last_line and next_line
# and outputting
last_line = next_line
next_line = fp.readline()
这遵循良好的、可读的软件模式,并且需要最少的资源。