AlignIO无法在FASTA文件中找到记录

1 投票
2 回答
1722 浏览
提问于 2025-04-17 18:20

我想开始使用Biopython来对齐序列文件,但这个库总是给我报错。我的代码如下:

from Bio import AlignIO
import Bio

alignment = AlignIO.read("A_prot.fasta","fasta")
print alignment

我确保把 A_prot.fasta 文件放在和我的程序同一个文件夹里,但我还是收到了一个错误提示,内容是:

Traceback (most recent call last):
  File "bio_seq_align.py", line 5, in <module>
   alignment = AlignIO.read("A_prot.fasta","fasta")
  File "/usr/lib/python2.7/site-packages/biopython-1.61-py2.7-linux-i686.egg/Bio/AlignIO/__init__.py", line 427, in read
raise ValueError("No records found in handle")
ValueError: No records found in handle

2 个回答

0

peterjc 提到一个很重要的点,AlignIO 需要输入对齐好的序列,而且这些序列的长度必须一样。如果你想读取一个包含未对齐序列的文件,可以使用 SeqIO,方法如下:

>>> from Bio import SeqIO
>>> handle = open("A_prot.fasta", "rU")
>>> print handle
<open file 'A_prot.fasta', mode 'rU' at 0x13fc1d8>
>>> 

如果你想把这些序列读入一个字典,可以用类似下面的代码:

>>> record_dict = SeqIO.to_dict(SeqIO.parse(handle, "fasta"))
>>> print len(record_dict)
2186 # Fasta file contains 2186 entries
>>>  

在这种情况下,记录的 ID 会成为字典的键。要访问与特定键相关的信息,可以使用:

>>> record_dict['HLA:HLA00001']
SeqRecord(seq=Seq('MAVMAPRTLLLLLSGALALTQTWAGSHSMRYFFTSVSRPGRGEPRFIAVGYVDD...CKV', SingleLetterAlphabet()), id='HLA:HLA00001', name='HLA:HLA00001', description='HLA:HLA00001 A*01:01:01:01 365 bp', dbxrefs=[])
>>> 

想了解更多信息,可以参考 AlignIOSeqIO 的文档。

0

你遇到“ValueError: No records found in handle”的一个原因可能是你电脑上的文件实际上是空的。

我在使用你在上面评论中提到的这个链接 ftp://ftp.ebi.ac.uk/pub/databases/ipd/imgt/hla/A_prot.fasta 时就是这样的情况,

>>> from Bio import AlignIO
>>> align = AlignIO.read("A_prot.fasta", "fasta")
Traceback (most recent call last):
...
ValueError: Sequences must all be the same length

这是预期的结果——这个FASTA文件并不是一组对齐的序列。如果你想把它当作对齐数据来加载,首先需要运行一个对齐工具,比如MUSCLE、Clustal Omega等。不过,我看过这个文件和它的长度范围,我怀疑在这个例子中这样做是合理的:

>>> from Bio import SeqIO
>>> lengths = set(len(record) for record in SeqIO.parse("A_prot.fasta", "fasta"))
>>> lengths
set([17, 19, 26, 50, 51, 53, 59, 65, 66, 71, 72, 73, 74, ..., 364, 365])

撰写回答