如何处理python中多行的信息?

时间:2012-03-08 20:31:59

标签: python parsing readfile

我有一个制表符分隔的文件,如下所示:

\>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列值line,后跟一个制表符,后跟非'>'的第2列值线。例如:

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

到目前为止,我已经编写了逐行读取文件的程序。在这种情况下,我需要将整个文件读入内存吗?输入文件不会超过大约30K行,总共大约10MB。在那之后,我假设我将从“对于每个不以'>'开头的行开始”从最近的前一行的第2列获取以“>”开头的值。我很欣赏任何正确阅读方向的指针 - 这比我到目前为止做的任何事都要复杂一点(宝贝步骤!)。

3 个答案:

答案 0 :(得分:2)

你可以通过逐步读取文件来做到这一点。你只需要保留一个变量来保存最后一个>的值。你见过的那条线。所以,像这样:

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 :(得分:1)

您可以逐行处理文件,检查每一行以查看它是否以“>”开头。当您遇到以“>”开头的行时,请捕获第二列中的值。对于不以“>”开头的行,您可以输出最后捕获的值以及相关的子值。

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())

答案 2 :(得分:0)

足以跟踪以'>'开头的最后一行。您可以根据无效输入的强大程度来调整脚本:

#!/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

Output

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