python文件解析next()函数

python文件解析next()函数,python,Python,我有一些函数用程序数据输出解析文本文件。显然,在解析时,我在文本中寻找一些标记数据的模式。但是,如果所需的行没有标记,并且可能仅以类似“行的第三行,从“data”关键字开始”的方式定义,我使用下一个函数来计算这些行,例如,如果我需要倒数三行,则将有三个line=nextfo语句。参见示例函数: def get_length(fn): with open(fn, 'r') as inp: for line in inp: if line.strip(

我有一些函数用程序数据输出解析文本文件。显然,在解析时,我在文本中寻找一些标记数据的模式。但是,如果所需的行没有标记,并且可能仅以类似“行的第三行,从“data”关键字开始”的方式定义,我使用下一个函数来计算这些行,例如,如果我需要倒数三行,则将有三个line=nextfo语句。参见示例函数:

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