python文件解析next()函数
我有一些函数用程序数据输出解析文本文件。显然,在解析时,我在文本中寻找一些标记数据的模式。但是,如果所需的行没有标记,并且可能仅以类似“行的第三行,从“data”关键字开始”的方式定义,我使用下一个函数来计算这些行,例如,如果我需要倒数三行,则将有三个line=nextfo语句。参见示例函数:python文件解析next()函数,python,Python,我有一些函数用程序数据输出解析文本文件。显然,在解析时,我在文本中寻找一些标记数据的模式。但是,如果所需的行没有标记,并且可能仅以类似“行的第三行,从“data”关键字开始”的方式定义,我使用下一个函数来计算这些行,例如,如果我需要倒数三行,则将有三个line=nextfo语句。参见示例函数: def get_length(fn): with open(fn, 'r') as inp: for line in inp: if line.strip(
def get_length(fn):
with open(fn, 'r') as inp:
for line in inp:
if line.strip().startswith('HOMOGENEIZED CROSS SECTIONS FOR CELL'):
line = next(inp)
line = next(inp)
line = next(inp)
sigtr = float(line.split()[9])
siga = float(line.split()[6])
length = 1.0/(3.0*sigtr*siga)
return length
在我看来,用next数数行似乎很愚蠢。也许,有更优雅、更通俗的方法来实现这种“行计数”?也许是这样的:
def get_length(fn):
with open(fn, 'r') as inp:
x = None
for n, line in enumerate(inp):
if x is None and line.strip().startswith('HOMOGENEIZED CROSS SECTIONS FOR CELL'):
x = n + 3
elif x == n:
sigtr = float(line.split()[9])
siga = float(line.split()[6])
x = None
length = 1.0/(3.0*sigtr*siga)
return length
试试这个一种可能性是,您可以编写一个通用的iterable消耗函数,它消耗给定生成器/迭代器的n个单位。比如:
def consume_and_ignore(gen, n):
for _ in itertools.repeat(None, n):
next(gen)
def get_length(fn):
with open(fn, 'r') as inp:
for line in inp:
if line.strip().startswith('HOMOGENEIZED CROSS SECTIONS FOR CELL'):
consume_and_ignore(inp, 2)
line = next(inp)
sigtr = float(line.split()[9])
siga = float(line.split()[6])
length = 1.0/(3.0*sigtr*siga)
return length
def consume_and_ignore(gen, n):
for _ in itertools.repeat(None, n):
next(gen)
def get_length(fn):
with open(fn, 'r') as inp:
for line in inp:
if line.strip().startswith('HOMOGENEIZED CROSS SECTIONS FOR CELL'):
consume_and_ignore(inp, 2)
line = next(inp)
sigtr = float(line.split()[9])
siga = float(line.split()[6])
length = 1.0/(3.0*sigtr*siga)
return length