使用BioPython中的Entrez从GenBank中检索和解析蛋白质序列

时间:2013-12-30 22:11:05

标签: python parsing biopython fasta protein-database

很快就会很明显,我是Python和编码的新手。我有一个基因ID列表存储为文本文件,我想使用Entrez函数搜索GenBank数据库并检索对应于ID的蛋白质序列。理想情况下,我希望最终产品是FASTA文件,因为我现在真的只对序列感兴趣。使用Biopython教程(http://biopython.org/DIST/docs/tutorial/Tutorial.html#sec15),我想出了这个:

from Bio import Entrez
from Bio import SeqIO
Entrez.email = "me@mysite.com"
id_list = set(open('test.txt', 'rU'))
handle = Entrez.efetch(db="protein", id=id_list, rettype="fasta", retmode="text")   
for seq_record in SeqIO.parse(handle, "fasta"):
    print ">" + seq_record.id, seq_record.description
print seq_record.seq
handle.close()

但是当我运行它时,我收到错误:

File "C:/Python27/Scripts/entrez_files.py", line 5, in <module>
  handle = Entrez.efetch(db="protein", id=id_list, rettype="fasta", retmode="text")
File "C:\Python27\lib\site-packages\Bio\Entrez\__init__.py", line 145, in efetch
  if ids.count(",") >= 200:
AttributeError: 'set' object has no attribute 'count'

每次使用rettype ='fasta'时都会出现类似的错误。当我使用rettype ='gb'时,我没有收到此错误,但我真的想最终得到一个fasta文件。有人有什么建议吗?谢谢!

编辑: 抱歉,我忽略了包含输入文件的内容。在一个完美的世界中,代码将接受这样的输入格式:

gi|285016822|ref|YP_003374533.1|
gi|285018887|ref|YP_003376598.1|
gi|285016823|ref|YP_003374534.1|
gi|285016824|ref|YP_003374535.1| 
....

但我也试过使用只有Gene ID(GI)的简化版本:

285016822 
285018887 
285016823
285016824...

1 个答案:

答案 0 :(得分:1)

正如您在efetch's source code中看到的那样,id参数必须采用count方法。通常,这将是一个包含单个ID的字符串或包含所有ID的Python列表。你正在使用set,大概是为了消除重复的值,所以你可以转换成这样的列表:

id_list = set(open('test.txt', 'rU'))
id_list = list(id_list)