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

2024-10-01 13:34:10 发布

您现在位置:Python中文网/ 问答频道 /正文

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

\>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列值。例如:

^{pr2}$

到目前为止,我已经写了一行一行读文件的脚本。我需要把整个文件都读入内存吗?输入文件不会超过大约30K行,总共大约10MB。在这之后,我假设我将以类似“对于每一行不以'>;'开头的行,从最近的前一行的第2列中获取值,并且以'>;'开头。如果有任何指向正确方向的指针,我会非常感激-这比我迄今为止所做的任何事情都要复杂一些(小步骤!)。在


Tags: 文件内存gt脚本信息制表符行时iv
3条回答

跟踪以'>'开头的最后一行就足够了。您可以根据脚本对无效输入的鲁棒性进行调整:

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

用法

^{pr2}$

Output

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

当然,可以通过增量读取文件来完成此操作。您只需要保留一个变量来保存您看到的最后一行的值。所以,像这样:

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)

您可以逐行处理文件,检查每行是否以“>;”开头。当遇到以“>;”开头的行时,请捕获第二列中的值。对于不以“>;”开头的行,可以输出上次捕获的值以及关联的子值。在

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

相关问题 更多 >