2014-01-08 3 views
0

У меня проблема: Открываю файл и читаю его по строкам, ищем определенный узор. Когда я нашел его, я хотел бы написать всю строку AND THE NEXT TWO LINES в новый файл. Проблема заключается в том, что я не знаю, как получить от линии, которую я нашел на следующий 2.Найти строку, затем получить следующую строку

AAA 
XXX 
XXX 
BBB 
XXX 
XXX 
CCC 
XXX 
XXX 

В этом примере было бы, что я считаю «В», и я хочу, чтобы получить следующие две строки.

Что мне делать? Большое вам спасибо за вашу любезную помощь!

Редактировать: Я понял, что должен уточнить.

Это код от моего коллеги

for k in range(0,len(watcrd)): 
    if cvt[k]>cvmin: 
     intwat+=1 
     sumcv+=cvt[k] 
     sumtrj+=trj[k]/((i+1)*sep/100) 
     endline='%5.2f %5.2f' % (cvt[k],trj[k]/((i+1)*sep/100)) # ivan 
     ftrj.write(watline[k][:55]+endline+'\n') 
     fall.write(watline[k][:55]+endline+'\n') 

Для каждого k in range я хотел бы написать k, k+1, k+2 в файл ftrj. Каков наилучший способ сделать это?

Редактировать 2: Извините, но я понял, что совершил ошибку. То, что вы предложили, работает, но я понял, что должен включить его в другую часть кода.

for line in lines[model[i]:model[i+1]]: 
    if line.startswith('ATOM'): 
    resi=line[22:26] 
    resn=line[17:20] 
    atn=line[12:16] 
    crd=[float(line[31:38]),float(line[38:46]),float(line[46:54])] 

    if (resn in noprot)==False and atn.strip().startswith('CA')==True: 
     protcrd.append(crd) 
    if (resn in reswat)==True and (atn.strip() in atwat)==True: 
     watcrd.append(crd) 
     watline.append(line) 

Я думаю, что-то вроде этого:

(...) 
    if (resn in reswat)==True and (atn.strip() in atwat)==True: 
     watcrd.append(crd) 
     watline.append(line) 
     for i in range(1, 3): 
      try: 
       watcrd.append(crd[line + i]) 
       watline.append(line[line + i]) 
      except IndexError: 
       break 

Но это не работает. Как я могу указать часть и строку, которую я хочу добавить в этот список?

ответ

5

файловые объекты Python являются итераторы, вы всегда можете попросить следующей строки:

with open(inputfilename) as infh: 
    for line in infh: 
     if line.strip() == 'BBB': 
      # Get next to lines: 
      print next(infh) 
      print next(infh) 

Здесь next() function продвигает infh итератор на следующую строку, возвращая эту строку.

Однако вы не обрабатываете файл; вы обрабатываете список; Вы всегда можете получить доступ к более поздним индексам в списке:

ftrj.write(watline[k][:55]+endline+'\n') 
    fall.write(watline[k][:55]+endline+'\n') 
    for i in range(1, 3): 
     try: 
      ftrj.write(watline[k + i][:55]+endline+'\n') 
      fall.write(watline[k + i][:55]+endline+'\n') 
     except IndexError: 
      # we ran out of lines in watline 
      break 
+0

из любопытства, это считается более «вещим», чем найти индекс и и получить '' 'линии [индекс: индекс +-]' ''? – wnnmaw

+0

У вас нет индекса, когда вы выполняете итерацию по файлу. – Matthias

+1

@wnnmaw: это считывает файл строки за строкой (с использованием буферизованного ввода-вывода), без необходимости сразу считывать весь файл в память. Это намного эффективнее, чем чтение всего файла в список, а затем управление списком. –

Смежные вопросы