Python从多行字符串中提取字符串

时间:2013-11-26 02:56:52

标签: python string indexing extract fasta

我想从输入文件中提取字符串,如下所示:

>a11
UCUUUGGUUAUCUAGCUGUAUGA
>a11
UCUUUGGUUAUCUAGCUGUAUGA
>b22
UGGUCGACCAGUUGGAAAGUAAU
>b22
ACUUCACCUGGUCCACUAGCCGU
>b22
AGGUUGUCUGUGAUGAGUUCG
>t33
UUAAUGCUAAUCGUGAUAGGGGU
>t33
CAGUAACAAAGAUUCAUCCUUGU

该行以">"开头是一个标题,下面的行是一个序列。

我想用"> b22"

提取带有标题的序列。

这是我的代码,没有给出正确答案。

def extractData():
    filename = ("data.txt")
    infile = open(filename,'r')

    for x in infile.readlines():
        x = x.strip()
        if x.startswith(">"):
            header = x
        else:
            sequence = x
        if header.startswith(">b22"):
            print(header, sequence)
    infile.close()

extractData()

它给出了这样的结果:

>b22 UCUUUGGUUAUCUAGCUGUAUGA
>b22 UGGUCGACCAGUUGGAAAGUAAU
>b22 UGGUCGACCAGUUGGAAAGUAAU
>b22 ACUUCACCUGGUCCACUAGCCGU
>b22 ACUUCACCUGGUCCACUAGCCGU
>b22 AGGUUGUCUGUGAUGAGUUCG

但是,我的预期结果是这样的:

>b22 UGGUCGACCAGUUGGAAAGUAAU
>b22 ACUUCACCUGGUCCACUAGCCGU
>b22 AGGUUGUCUGUGAUGAGUUCG

有人可以解决这个问题吗?什么问题,我应该用什么来表达正确的结果呢?

2 个答案:

答案 0 :(得分:2)

代码中的细微更改:

def extractData():
    filename = ("data.txt")
    infile = open(filename,'r')

    for x in infile.readlines():
        x = x.strip()
        if x.startswith(">"):
            header = x
        else:
            sequence = x
            if header.startswith(">b22"):
                print(header, sequence)
                header = ''


    infile.close()

extractData()

顺便说一下,您可以使用调试器来识别程序流程的错误。如果您是Python新手,那么我建议使用Eclipse和Pydev插件进行交互式调试。 Link for Tutorial on Pydev in Eclipse

话虽如此,出现问题是因为正在为从文件解析的每一行评估if header.startswith(">b22")。当你在else块内移动它时,它只会在你完成解析序列后进行评估(显然它不会评估header行)。

答案 1 :(得分:1)

这是一种不同的方法:

>>> with open('data.txt') as f:
...     for line in f:
...         if line.startswith('>b22'):
...             print('{0} {1}'.format(line.strip(), next(f).strip()))
...
>b22 UGGUCGACCAGUUGGAAAGUAAU
>b22 ACUUCACCUGGUCCACUAGCCGU
>b22 AGGUUGUCUGUGAUGAGUUCG

由于文件可以迭代,当你到达>b22的行时,你可以使用next()来读取下一行。