GFF3格式 (skbio.io.format.gff3
)¶
GFF3(Generic Feature Format version 3)是描述生物序列特征的标准文件格式。它包含文本行,每行由9个制表符分隔的列组成 [1].
格式支持¶
有嗅探员:是的
读者 |
writer |
对象类 |
---|---|---|
是的 |
是的 |
|
是的 |
是的 |
|
是的 |
是的 |
|
是的 |
是的 |
元组的生成器(str类型的序列号, |
格式规范¶
状态:从0.5.1开始试验。
文件的第一行是标识格式和版本的注释。接下来是一系列的数据线。每个数据行对应于一个注释,由9列组成:SEQID、SOURCE、TYPE、START、END、SCORE、STRAND、PHASE和ATTR。
第9列(ATTR)是“tag=value”格式的特性属性列表。多个“tag=value”对用分号分隔。同一标记的多个值用逗号“,”分隔。以下标记具有预定义的含义:ID、Name、Alias、Parent、Target、Gap、Derives_from、Note、Dbxref、Ontology_term和Is_circular。
格式规范中详细解释了这些列和属性的含义和格式 [1]. 它们被读入GenBank解析器中定义的词汇表 (skbio.io.format.genbank
)
格式参数¶
读卡器特定参数¶
IntervalMetadata
GFF3读卡器需要1个参数: seq_id
. 它将具有指定序列ID的注释从GFF3文件读入 IntervalMetadata
对象。
DNA
和 Sequence
GFF3读卡器要求 seq_num
作为参数。它指定从包含多个序列注释的GFF3文件中读取哪个GFF3记录。
写入程序特定参数¶
skip_subregion
是所有GFF3编写器都使用的布尔参数。它指定是否要为要素注释写入每个不连续的子区域。例如,如果一个基因中有两个外显子,则 IntervalMetadata
对象时,它将在GFF3文件中写入一行 skip_subregion
是 True
并将写下3行(分别为基因和外显子各一行)当 skip_subregion
是 False
. 默认是 True
.
此外, IntervalMetadata
GFF3 writer需要参数 seq_id
. 它指定注释所属的序列ID(GFF3文件中的第1列)。
示例
让我们创建一个文件流,其中包含GFF3格式的以下数据:
>>> from skbio import Sequence, DNA
>>> gff_str = """
... ##gff-version 3
... seq_1\t.\tgene\t10\t90\t.\t+\t0\tID=gen1
... seq_1\t.\texon\t10\t30\t.\t+\t.\tParent=gen1
... seq_1\t.\texon\t50\t90\t.\t+\t.\tParent=gen1
... seq_2\t.\tgene\t80\t96\t.\t-\t.\tID=gen2
... ##FASTA
... >seq_1
... ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC
... ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC
... >seq_2
... ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC
... ATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGCATGC
... """
>>> import io
>>> from skbio.metadata import IntervalMetadata
>>> from skbio.io import read
>>> gff = io.StringIO(gff_str)
我们可以读懂它 IntervalMetadata
. 每一行都将被读入 IntervalMetadata
对象:
>>> im = read(gff, format='gff3', into=IntervalMetadata,
... seq_id='seq_1')
>>> im
3 interval features
-------------------
Interval(interval_metadata=<4604421736>, bounds=[(9, 90)], fuzzy=[(False, False)], metadata={'type': 'gene', 'phase': 0, 'strand': '+', 'source': '.', 'score': '.', 'ID': 'gen1'})
Interval(interval_metadata=<4604421736>, bounds=[(9, 30)], fuzzy=[(False, False)], metadata={'strand': '+', 'source': '.', 'type': 'exon', 'Parent': 'gen1', 'score': '.'})
Interval(interval_metadata=<4604421736>, bounds=[(49, 90)], fuzzy=[(False, False)], metadata={'strand': '+', 'source': '.', 'type': 'exon', 'Parent': 'gen1', 'score': '.'})
我们可以写 IntervalMetadata
对象返回到GFF3文件:
>>> with io.StringIO() as fh:
... print(im.write(fh, format='gff3', seq_id='seq_1').getvalue())
##gff-version 3
seq_1 . gene 10 90 . + 0 ID=gen1
seq_1 . exon 10 30 . + . Parent=gen1
seq_1 . exon 50 90 . + . Parent=gen1
如果GFF3文件没有序列ID,它将返回一个空对象:
>>> gff = io.StringIO(gff_str)
>>> im = read(gff, format='gff3', into=IntervalMetadata,
... seq_id='foo')
>>> im
0 interval features
-------------------
我们还可以将GFF3文件读入生成器:
>>> gff = io.StringIO(gff_str)
>>> gen = read(gff, format='gff3')
>>> for im in gen:
... print(im[0]) # the seq id
... print(im[1]) # the interval metadata on this seq
seq_1
3 interval features
-------------------
Interval(interval_metadata=<4603377592>, bounds=[(9, 90)], fuzzy=[(False, False)], metadata={'type': 'gene', 'ID': 'gen1', 'source': '.', 'score': '.', 'strand': '+', 'phase': 0})
Interval(interval_metadata=<4603377592>, bounds=[(9, 30)], fuzzy=[(False, False)], metadata={'strand': '+', 'type': 'exon', 'Parent': 'gen1', 'source': '.', 'score': '.'})
Interval(interval_metadata=<4603377592>, bounds=[(49, 90)], fuzzy=[(False, False)], metadata={'strand': '+', 'type': 'exon', 'Parent': 'gen1', 'source': '.', 'score': '.'})
seq_2
1 interval feature
------------------
Interval(interval_metadata=<4603378712>, bounds=[(79, 96)], fuzzy=[(False, False)], metadata={'strand': '-', 'type': 'gene', 'ID': 'gen2', 'source': '.', 'score': '.'})
对于具有序列的GFF3文件,我们可以将其读入 Sequence
或 DNA
:
>>> gff = io.StringIO(gff_str)
>>> seq = read(gff, format='gff3', into=Sequence, seq_num=1)
>>> seq
Sequence
--------------------------------------------------------------------
Metadata:
'description': ''
'id': 'seq_1'
Interval metadata:
3 interval features
Stats:
length: 100
--------------------------------------------------------------------
0 ATGCATGCAT GCATGCATGC ATGCATGCAT GCATGCATGC ATGCATGCAT GCATGCATGC
60 ATGCATGCAT GCATGCATGC ATGCATGCAT GCATGCATGC
>>> gff = io.StringIO(gff_str)
>>> seq = read(gff, format='gff3', into=DNA, seq_num=2)
>>> seq
DNA
--------------------------------------------------------------------
Metadata:
'description': ''
'id': 'seq_2'
Interval metadata:
1 interval feature
Stats:
length: 120
has gaps: False
has degenerates: False
has definites: True
GC-content: 50.00%
--------------------------------------------------------------------
0 ATGCATGCAT GCATGCATGC ATGCATGCAT GCATGCATGC ATGCATGCAT GCATGCATGC
60 ATGCATGCAT GCATGCATGC ATGCATGCAT GCATGCATGC ATGCATGCAT GCATGCATGC
引用