2015-03-05 6 views
0

У меня есть некоторые функции для разбора текстовых файлов с выходом программных данных. При разборе, очевидно, я ищу некоторые шаблоны в тексте, которые отмечают данные. Но если нужная строка не отмечена так или иначе и может быть определена только так, как «третья строка из строки, начиная с ключевого слова« data », я использую функцию next() для подсчета этих строк (например, если мне нужно подсчитать вниз три линии будет три линии = следующей (Ф.О.) заявлений см образца функция, например:..python file parsing next() function

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 

Этого подсчет строки с рядом() кажется довольно тупая мне Может быть, есть какой-то более элегантный и вещий путь для реализации такой 'подсчет линии'

ответ

1

Может быть, это:

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 
-1
def get_length(fn): 

with open(fn, 'r') as inp: 

    li = inp.readlines() 
    i = 0 
    while(i<len(li)): 
     if li[i].strip().startswith('HOMOGENEIZED CROSS SECTIONS FOR CELL'):   i = i+3 
      sigtr = float(li[i].split()[9]) 
      siga = float(li[i].split()[6]) 
length = 1.0/(3.0*sigtr*siga) 
return length 

попробовать это

+1

'LEN (вх)' является * плохой * идея ... –

+0

да, я забуду: – user116541

0

Одна возможность состоит в том, что вы могли бы написать общий 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