Как обрабатывать информацию из нескольких строк в python? - PullRequest
0 голосов
/ 09 марта 2012

У меня есть файл с разделителями табуляции, который выглядит примерно так:

\>WB02      \t F27C8.1  
IV  \t      B-9641      
\>WB03  \t  F07C3.7   
\>WB04  \t  F52H2.2   
\>WB04  \t  F52H2.2   
\>WB05  \t  T13A10.10     
IV  \t  B-15643   
IV  \t  B-11650   
IV  \t  B-13649

Используя python, я хотел бы связать информацию из строк, начинающихся с «>», с информацией из любых последующих строк, поэтому не начинайте с «>». Каждый раз, когда есть строка «>», за которой следует строка, отличная от «>», я хотел бы напечатать значение столбца 2 из строки «>», затем вкладку, а затем значение столбца 2 из не> ' линия. Например:

F27C8.1 \t B-9641  
T13A10.10 \t B-15643  
T13A10.10 \t B-11650  
T13A10.10 \t B-13649  

К настоящему времени я написал сценарии, которые читают файлы построчно. В этом случае мне нужно будет прочитать весь файл в память? Входной файл не будет превышать 30K строк, всего около 10 МБ. После этого я предполагаю, что я начну с чего-то вроде «Для каждой строки, которая не начинается с«> », получить значение из столбца 2 ближайшей предыдущей строки, которая начинается с«> ». Я был бы признателен за любые указатели в правильном направлении для чтения - это немного сложнее, чем все, что я делал до сих пор (детские шаги!).

Ответы [ 3 ]

2 голосов
/ 09 марта 2012

Конечно, вы можете сделать это, читая файл постепенно. Вам просто нужно сохранить переменную, чтобы сохранить значение последней> строки, которую вы видели. Итак, как-то так:

with open("input.txt") as f:
    lastmarkedline = None
    for line in f:
        if line.startswith('>'):
            lastmarkedline = line
        elif lastmarkedline is not None:
            field1 = lastmarkedline.split()[1]
            field2 = line.split()[1]
            print "{0}\t{1}".format(field1, field2)
1 голос
/ 09 марта 2012

Вы можете обрабатывать файл построчно, проверяя каждую строку, чтобы увидеть, начинается ли он с «>». Когда вы встретите строку, которая начинается с «>», запишите значение во второй столбец. Для строк, которые не начинаются с «>», вы можете вывести последнее захваченное значение вместе со связанным подзначением.

with open('data.txt', 'r') as f:
    lastHeader = ''
    for line in f:
        pieces = line.split('\t')
        if line[0] == '>':
            lastHeader = pieces[1].strip()
        else:
            print "%s  \t  %s" % (lastHeader, pieces[1].strip())
0 голосов
/ 09 марта 2012

Достаточно отслеживать последнюю строку, которая начинается с '>'.Вы можете настроить скрипт в зависимости от того, насколько он должен быть устойчивым к неверному вводу:

#!/usr/bin/env python
import fileinput

last = None
for line in fileinput.input():
    mark, sep, value = line.partition('\t')
    if not sep: continue # skip lines without a tab
    if mark.startswith('>WB'):
       last = value.strip()
    elif mark.strip() == 'IV':
       print('%s\t%s' % (last, value.strip()))

Использование

$ python thescript.py input.txt

Вывод

F27C8.1 B-9641
T13A10.10   B-15643
T13A10.10   B-11650
T13A10.10   B-13649
...