如何在Python中读取fasta文件?

6
我正在尝试读取一个FASTA文件,然后查找特定的motif(string)并打印出其序列和出现次数。FASTA文件只是一系列以头部行开始的序列(字符串),头部或新序列的标志为">"。在头部之后的新行中是字母序列。目前我还没有完成代码,但到目前为止我有这个并且它给我这个错误:

AttributeError:'str'对象没有'next'属性


我不确定这里出了什么问题。
import re

header=""
counts=0
newline=""

f1=open('fpprotein_fasta(2).txt','r')
f2=open('motifs.xls','w')
for line in f1:
    if line.startswith('>'):
        header=line
        #print header
        nextline=line.next()
        for i in nextline:
            motif="ML[A-Z][A-Z][IV]R"
            if re.findall(motif,nextline):
                counts+=1
                #print (header+'\t'+counts+'\t'+motif+'\n')
        fout.write(header+'\t'+counts+'\t'+motif+'\n')

f1.close()
f2.close()

2
这是为教育还是工作而分配的任务?因为已经有多个可用的库可以完成这个任务。 - Lev Levitsky
学校作业。 - user3098683
4个回答

6
错误可能来自这一行代码:
nextline=line.next()

line 是你已经读取的字符串,它上面没有 next() 方法。

问题的一部分在于你试图混合使用两种不同的读取文件方式——你正在使用 for line in f1<handle>.next() 迭代行。

此外,如果你正在处理 FASTA 文件,我建议使用Biopython:它使得处理序列集合变得更加容易。特别是,第14章关于模体的内容将对你特别有帮助。这可能需要你学习更多的 Python 知识才能实现你想要的功能,但如果你要做比你这里展示的例子更多的生物信息学工作,那么这绝对值得投资时间。


谢谢!是的,我将使用Biopython。但是对于这个任务,我必须使用Python。我试图做的是需要读取标题后面的行,这就是为什么我使用了.next(),但显然是错误的! - user3098683

2
这可能有助于使您朝着正确的方向前进。
import re

def parse(fasta, outfile):
    motif = "ML[A-Z][A-Z][IV]R"
    header = None
    with open(fasta, 'r') as fin, open(outfile, 'w') as fout:
            for line in fin:
                if line.startswith('>'):
                    if header is not None:
                        fout.write(header + '\t' + str(count) + '\t' + motif + '\n')
                    header = line
                    count = 0
                else:
                    matches = re.findall(motif, line)
                    count += len(matches)
            if header is not None:
                fout.write(header + '\t' + str(count) + '\t' + motif + '\n')
if __name__ == '__main__':
    parse("fpprotein_fasta(2).txt", "motifs.xls")

0

我不确定关于意大利面的事情,但我非常确定你在这里做错了:

nextline=line.next()

line是一个简单的str,所以你不能调用str.next()

另外,关于文件,建议使用:

with open('fpprotein_fasta(2).txt','r') as f1:

这将自动处理文件关闭。

建议您提供一个样本fasta文件,以便我可以尝试纠正代码。


gi|951040|emb|CAA62241.1| 酒精脱氢酶 [挪威鼠] MGTQGKVITCKAAIAWKTDSPLCIEEIEVSPPKAHEVRIKVIATCVCPTDINATNPKKKALFPVVLGHECAGIVESVGPGVTNFKPGDKVIPFFAPQCKKCKLCLSPLTNLCGKLRNFKYPTIDQELMEDRTSRFTSKERSIYHFMGVSSFSQYTVVSEANLARVDDEANLERVCLIGCGFTSGYGAAINTAKVTPGSACAVFGLGCVGL - user3098683
这是格式的示例。标题为>gi|951040|balh blah blah,下一行是我试图在其中找到模体的内容。 - user3098683

0

这是我如何将FASTA文件加载到字典中:

motifs = dict()

with open('[path to FASTA file]\filename.fna') as f:
lines = f.readlines()
for i in range(0, len(lines)):
    s = lines[i].strip()
    if s[0] == '>':
        key = s[1:]
    else:
        motifs[key] = s

每一行以'>'字符开头,包含下一行的id(key)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接