5.1.4 提取数据¶
SeqRecord 对象及其注释信息在第 4 章中有更详细的介绍。为了解释注释信息是如何存储的,我们从GenBank文件 ls_orchid.gbk 中解析出第一个序列条目,并将其输出:
from Bio import SeqIO
record_iterator = SeqIO.parse("ls_orchid.gbk", "genbank")
first_record = next(record_iterator.next())
print(first_record)
输出结果:
ID: Z78533.1
Name: Z78533
Description: C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA.
Number of features: 5
/sequence_version=1
/source=Cypripedium irapeanum
/taxonomy=['Eukaryota', 'Viridiplantae', 'Streptophyta', ..., 'Cypripedium']
/keywords=['5.8S ribosomal RNA', '5.8S rRNA gene', ..., 'ITS1', 'ITS2']
/references=[...]
/accessions=['Z78533']
/data_file_division=PLN
/date=30-NOV-2006
/organism=Cypripedium irapeanum
/gi=2765658
Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGG...CGC')
这可以得到 SeqRecord 大部分的易读的注释汇总信息。在此例中,我们将使用 .annotations 属性-即Python字典(dictionary)。该注释字典的内容如上述示例结果,你也可以直接输出:
print(first_record.annotations)
与其他Python字典一样,你可以轻松地获得键列表:
print(first_record.annotations.keys())
或者值列表:
print(first_record.annotations.values())
通常,注释值是字符串或者字符串列表。一个特例是,文件中的所有参考文献(references)都以引用(reference)对象方式存储。
例如你想从GenBank文件 ls_orchid.gbk 中提取出物种列表。我们需要的信息 Cypripedium irapeanum 被保存在这个注释字典的‘source’和‘organism’键中,我们可以用下面的方式获取:
>>>print(first_record.annotations["source"])
Cypripedium irapeanum
或:
>>>print(first_record.annotations["organism"])
Cypripedium irapeanum
通常,‘organism’ 用于学名(拉丁名,e.g. Arabidopsis thaliana ),而 ‘source’ 用于俗名(common name)(e.g. thale cress)。在此例中,以及在通常情况下,这两个字段是相同的。
现在,让我们遍历所有的序列条目, 创建一个包含所有兰花序列的物种列表:
from Bio import SeqIO
all_species = []
for seq_record in SeqIO.parse("ls_orchid.gbk", "genbank"):
all_species.append(seq_record.annotations["organism"])
print(all_species)
另外一种方式是使用列表解析:
from Bio import SeqIO
all_species = [seq_record.annotations["organism"] for seq_record in \
SeqIO.parse("ls_orchid.gbk", "genbank")]
print(all_species)
两种方式的输出结果相同:
['Cypripedium irapeanum', 'Cypripedium californicum', ..., 'Paphiopedilum barbatum']
因为GenBank文件注释是以标准方式注释,所以相当简单。
现在,假设你需要从一个FASTA文件而不是GenBank文件提取出物种列表,那么你不得不多写一些代码,用以从序列条目的描述行提取需要的数据。使用的示例FASTA文件 ls_orchid.fasta 格式如下:
>gi|2765658|emb|Z78533.1|CIZ78533 C.irapeanum 5.8S rRNA gene and ITS1 and ITS2 DNA
CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGGAATAAACGATCGAGTG
AATCCGGAGGACCGGTGTACTCAGCTCACCGGGGGCATTGCTCCCGTGGTGACCCTGATTTGTTGTTGGG
...
你可以手动检查,对于每一个序列条目,物种名都是描述行的第二个单词。这意味着如果我们以空白分割序列条目的 .description ,物种名将会是第1个元素(第0个元素是序列ID),我们可以这样做:
from Bio import SeqIO
all_species = []
for seq_record in SeqIO.parse("ls_orchid.fasta", "fasta"):
all_species.append(seq_record.description.split()[1])
print(all_species)
将得到:
['C.irapeanum', 'C.californicum', 'C.fasciculatum', 'C.margaritaceum', ..., 'P.barbatum']
使用更简洁的列表解析:
from Bio import SeqIO
all_species == [seq_record.description.split()[1] for seq_record in \
SeqIO.parse("ls_orchid.fasta", "fasta")]
print(all_species)
通常,对FASTA描述行提取信息不是那么方便。如果你能获得对目标序列注释很好的文件格式如GenBank或者EMBL,那么这类注释信息就很容易处理。