很快就会很明显,我是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...
答案 0 :(得分:1)
正如您在efetch's source code中看到的那样,id
参数必须采用count
方法。通常,这将是一个包含单个ID的字符串或包含所有ID的Python列表。你正在使用set
,大概是为了消除重复的值,所以你可以转换成这样的列表:
id_list = set(open('test.txt', 'rU'))
id_list = list(id_list)