FASTA/QUAL格式 (skbio.io.format.fasta

FASTA文件格式 (fasta )以简单的纯文本格式存储生物(即核苷酸或蛋白质)序列,既可读又易于解析。介绍了软件包中第一个使用的是FASTA文件格式 [1]. 有关文件格式的其他说明,请参见 [2][3].

包含两个DNA序列的FASTA格式文件的示例:

>seq1 db-accession-149855
CGATGTCGATCGATCGATCGATCAG
>seq2 db-accession-34989
CATCGATCGATCGATGCATGCATGCATG

QUAL文件格式是与FASTA相关的附加格式。FASTA文件有时伴随着QUAL文件,特别是当FASTA文件包含在高通量测序仪器上生成的序列时。QUAL文件以FASTA格式存储序列中每个基的Phred质量分数(非负整数)(请参见 [4] 更多细节)。scikit-bio支持读写FASTA(可选的QUAL)文件格式。

格式支持

有嗅探员:是的

读者

writer

对象类

是的

是的

发电机 skbio.sequence.Sequence 物体

是的

是的

skbio.alignment.TabularMSA

是的

是的

skbio.sequence.Sequence

是的

是的

skbio.sequence.DNA

是的

是的

skbio.sequence.RNA

是的

是的

skbio.sequence.Protein

备注

所有读写器通过 qual 参数。如果提供了质量分数,除了FASTA序列数据外,还将读取/写入质量分数。

格式规范

以下部分详细定义了FASTA和QUAL文件格式。

FASTA格式

FASTA文件包含一个或多个生物序列。序列按顺序存储,其中 记录 对于每个序列(也称为 FASTA记录 ). 每个 记录 由一条直线组成 页眉 (有时称为 脱线标签描述评论 )后面是序列数据,可以选择拆分为多行。

备注

只允许在文件的开头、FASTA记录之间或文件末尾使用空白行或空白行。标题行之后、序列内(对于FASTA文件)或质量分数(对于QUAL文件)内的空白行或空白行将引发错误。

scikit-bio将在阅读时忽略每行的前导和尾随空格字符。

备注

scikit bio目前不支持传统的FASTA格式(即用分号表示的头/注释)。scikit-bio支持的格式(下面详细描述)与NCBI的BLAST文档中给出的描述非常相似 [3]. 见 [2] 有关旧版FASTA格式的更多详细信息。如果您希望将旧版FASTA格式支持添加到scikit-bio中,请考虑在 scikit-bio issue tracker (也欢迎拉取请求!)。

序列头

每个序列头由一个以大于开头的单行组成 (> )符号。紧随其后的是序列标识符(ID)和描述,由一个或多个空白字符分隔。

备注

读取FASTA格式的文件时,序列ID和描述存储在序列中 metadata 属性,在 'id''description' 钥匙,重复。两者都是可选的。每个都将被表示为空字符串 (''metadata 如果它不在标题中。

写FASTA格式的文件时,顺序 metadata 用钥匙识别 'id''description' 将转换为字符串,并分别写入序列标识符和描述。如果没有按顺序出现,则每个都将作为空字符串写入 metadata .

序列ID由单个 word :大于符号之后和第一个空白字符(如果有)之前的所有字符都被视为序列ID。唯一的序列ID不是由FASTA格式本身严格执行的。同样,FASTA格式也不强制使用单一的标准化ID格式,尽管通常使用唯一的库登录号作为序列ID(例如,NCBI的FASTA defline格式 [5]) .

如果存在描述,它将被视为序列ID和初始空格后面的剩余字符。描述被认为是关于序列的附加信息(例如,关于序列来源或它编码的分子的评论)。

例如,考虑以下标题:

>seq1 db-accession-149855

seq1 是序列ID和 db-accession-149855 是序列描述。

备注

scikit-bio的读者将从描述中删除所有前导和尾随空格。如果标题行以空格开头 > ,则假定缺少ID,而该行的其余部分作为说明。

序列数据

生物序列数据紧跟在报头之后,可以被分割成多行。序列数据(即核苷酸或氨基酸)使用标准IUPAC词典(单字母代码)存储。

备注

scikit-bio支持大写和小写字符。此功能取决于数据被读入的对象类型。为 Sequence 对象,西基生物不关心这个案子。其他序列对象也有,但都提供 lowercase 控制案例功能的参数。有关详细信息,请参阅每个类各自的构造函数文档。

两个 - and . 读入时支持作为空白字符 DNARNAProtein 序列对象。

在读取scikit-bio-sequence对象时执行验证,这些对象强制执行字母表(例如。, DNARNAProtein ). 如果在读取FASTA文件时发现任何无效字符,将引发异常。

QUAL格式

QUAL文件包含存储在相应FASTA文件中的一个或多个生物序列的质量分数。QUAL格式与FASTA格式非常相似:它按顺序存储记录,每个记录以包含序列ID和描述的标题行开头。同样的规则适用于QUAL头和FASTA头(请参阅上面的部分了解详细信息)。scikit bio以完全相同的方式处理FASTA和QUAL头文件。

QUAL文件不是在每个记录中存储生物序列数据,而是在相应的序列中存储每个碱基的Phred质量分数。质量分数表示为用空格隔开的非负整数(通常是一个空格或换行符),并且可以跨越多行。

备注

读取QUAL格式的文件时,质量分数存储在序列的 positional_metadata 属性 'quality' 列。

当编写一个QUAL格式的文件时,序列 positional_metadata 'quality' 列为质量分数。

备注

当读取FASTA和QUAL文件时,scikit bio要求记录在两个文件中的顺序相同(即,每个FASTA和QUAL记录在被解析后必须具有相同的ID和描述)。除了具有相同的顺序外,FASTA记录的数量必须与QUAL记录的数量相匹配(即不允许缺少或添加记录)。scikit-bio还要求质量分数的数量与相应序列中的碱基数量相匹配。

在编写FASTA和QUAL文件时,scikit-bio将在两个文件中保持相同的记录顺序(即在两个记录中使用相同的ID和描述),以支持将来的读取。

格式参数

以下参数可用于更改在scikit-bio中读取或写入FASTA/QUAL文件的方式。

QUAL文件参数(读卡器和写入器)

这个 qual 参数可用于所有FASTA格式的读取器和编写器。它可以是scikit bio的I/O注册表支持的任何类似文件的类型(例如,文件句柄、文件路径等)。如果 qual 是在阅读时提供的,质量分数将包含在每个内存中 Sequence 对象,以及存储在FASTA文件中的序列数据。写作时,除了序列数据以FASTA格式写入外,质量分数将以QUAL格式写入。

读卡器特定参数

可用的读卡器参数因使用的读卡器而异。

发电机和表格阅读器参数

这个 constructor 参数可以与 Sequence 发电机和 TabularMSA FASTA阅读器。 constructor 指定要将每个序列读入的内存序列对象的类型。例如,如果你知道你正在读的FASTA文件包含蛋白质序列,你就可以通过 constructor=Protein 给读者打电话。

当读入 Sequence 发电机, constructor 默认为 Sequence 并且必须是 Sequence 如果提供。

当读入 TabularMSAconstructor 是必需的格式参数,并且必须是 GrammaredSequence (例如, DNARNAProtein

备注

法斯塔嗅探员不会试图猜测 constructor 参数。

序列读取器参数

这个 seq_num 参数可以与 SequenceDNARNAProtein FASTA阅读器。 seq_num 指定从FASTA文件(和可选的QUAL文件)读取哪个序列,默认值为1(即读取第一个序列)。例如,要从FASTA文件中读取第50个序列,需要传递 seq_num=50 给读者打电话。

写入程序特定参数

以下参数适用于所有FASTA格式编写器:

  • id_whitespace_replacement :要替换的字符串 each 序列ID中的空白字符。此参数适用于内存中序列ID包含空白的情况,这将导致磁盘上的表示形式不会作为同一ID读回内存(因为FASTA格式的ID不能包含空白)。默认为 _ .如果 None ,则不执行空白替换,并且在ID存储在内存中时写入ID(这可能会创建一个无效的FASTA格式文件;请参见下面的注释)。如果提供了一个QUAL文件,这个参数也适用于它。

  • description_newline_replacement :要替换的字符串 each 序列描述中的换行符。因为FASTA头必须是一行,所以序列描述中不允许有新行,必须替换新行才能写入有效的FASTA文件。默认为单个空间。如果 None ,则不会执行换行操作,并且在存储在内存中时会写入描述(这可能会创建无效的FASTA格式文件;请参阅下面的注释)。如果提供了一个QUAL文件,这个参数也适用于它。

  • max_width :整数,指定序列数据和/或质量分数的最大线宽(即字符数)。如果一个序列或其质量分数大于 max_width ,它将被拆分为多行,每行的最大宽度为 max_width . 注意,分割质量分数时有一些注意事项。单一质量分数将 从未 否则,当两行的分数被分开时,质量就不同了。因此,只发生分裂 之间 质量分数。这使得有可能有一个长质量分数写在自己的行超过 max_width . 例如,质量分数 12345 不会被分割成多行,即使 max_width=3 . 因此,将写入5个字符的行。默认行为是不将序列数据或质量分数拆分为多行。

  • lowercase 字符串:或布尔数组。如果是字符串,则将其视为对象位置元数据的键。如果是布尔数组,则表示要以小写形式写入的字符。序列中的字符与 True 值将以小写形式写入。布尔数组的长度必须与序列相同。

备注

如果 id_whitespace_replacement 和/或 description_newline_replacement 设置为 None 这样就不会在编写过程中执行空格替换。但是,这可能会创建无效的FASTA文件,尤其是在id或描述中有换行符的情况下。对于带有空白的id,这也会影响在随后的读取操作中将id读入内存的方式。例如,如果内存中的序列ID是 'seq 1'id_whitespace_replacement=None ,将FASTA文件读回内存将导致ID 'seq''1' 是序列描述的一部分。

示例

读写FASTA文件

假设下面的FASTA文件有五个等长序列(示例修改自 [6]) ::

>seq1 Turkey
AAGCTNGGGCATTTCAGGGTGAGCCCGGGCAATACAGGGTAT
>seq2 Salmo gair
AAGCCTTGGCAGTGCAGGGTGAGCCGTGG
CCGGGCACGGTAT
>seq3 H. Sapiens
ACCGGTTGGCCGTTCAGGGTACAGGTTGGCCGTTCAGGGTAA
>seq4 Chimp
AAACCCTTGCCG
TTACGCTTAAAC
CGAGGCCGGGAC
ACTCAT
>seq5 Gorilla
AAACCCTTGCCGGTACGCTTAAACCATTGCCGGTACGCTTAA

备注

上述示例文件的原始版权声明:

(c) Copyright 1986-2008 by The University of Washington. Written by Joseph Felsenstein. Permission is granted to copy this document provided that no fee is charged for it and that this copyright notice is not removed.

文件的长度,取决于文件的长度。还要注意的是,有些序列出现在一条线上,而另一些序列则被分割成多条线。

让我们将内存中的这个文件定义为 StringIO ,但这可能是一个真正的文件路径、文件句柄或scikit bio的I/O注册表实际支持的任何内容:

>>> fl = [">seq1 Turkey\n",
...       "AAGCTNGGGCATTTCAGGGTGAGCCCGGGCAATACAGGGTAT\n",
...       ">seq2 Salmo gair\n",
...       "AAGCCTTGGCAGTGCAGGGTGAGCCGTGG\n",
...       "CCGGGCACGGTAT\n",
...       ">seq3 H. Sapiens\n",
...       "ACCGGTTGGCCGTTCAGGGTACAGGTTGGCCGTTCAGGGTAA\n",
...       ">seq4 Chimp\n",
...       "AAACCCTTGCCG\n",
...       "TTACGCTTAAAC\n",
...       "CGAGGCCGGGAC\n",
...       "ACTCAT\n",
...       ">seq5 Gorilla\n",
...       "AAACCCTTGCCGGTACGCTTAAACCATTGCCGGTACGCTTAA\n"]

由于这些序列长度相等(可能是因为它们已经对齐),让我们将FASTA文件读入 TabularMSA 对象:

>>> from skbio import TabularMSA, DNA
>>> msa = TabularMSA.read(fl, constructor=DNA)
>>> msa
TabularMSA[DNA]
------------------------------------------
Stats:
    sequence count: 5
    position count: 42
------------------------------------------
AAGCTNGGGCATTTCAGGGTGAGCCCGGGCAATACAGGGTAT
AAGCCTTGGCAGTGCAGGGTGAGCCGTGGCCGGGCACGGTAT
ACCGGTTGGCCGTTCAGGGTACAGGTTGGCCGTTCAGGGTAA
AAACCCTTGCCGTTACGCTTAAACCGAGGCCGGGACACTCAT
AAACCCTTGCCGGTACGCTTAAACCATTGCCGGTACGCTTAA

注意,我们没有在 read 打电话。FASTA嗅探器为我们检测到了正确的文件格式!

TabularMSA 在FASTA格式中:

>>> from io import StringIO
>>> with StringIO() as fh:
...     print(msa.write(fh).getvalue())
>seq1 Turkey
AAGCTNGGGCATTTCAGGGTGAGCCCGGGCAATACAGGGTAT
>seq2 Salmo gair
AAGCCTTGGCAGTGCAGGGTGAGCCGTGGCCGGGCACGGTAT
>seq3 H. Sapiens
ACCGGTTGGCCGTTCAGGGTACAGGTTGGCCGTTCAGGGTAA
>seq4 Chimp
AAACCCTTGCCGTTACGCTTAAACCGAGGCCGGGACACTCAT
>seq5 Gorilla
AAACCCTTGCCGGTACGCTTAAACCATTGCCGGTACGCTTAA

TabularMSA 一次将FASTA文件中的所有序列加载到内存中。如果FASTA文件很大(通常是这样),如果没有足够的内存,这可能是不可行的。为了解决这个问题,您可以使用scikit-bio的基于生成器的FASTA读写器来流化序列。基于生成器的读卡器生成 Sequence 对象(或子类,如果 constructor ,而不是将所有序列加载到内存中。例如,让我们使用基于生成器的读取器在 for 循环:

>>> import skbio.io
>>> for seq in skbio.io.read(fl, format='fasta'):
...     seq
...     print('')
Sequence
------------------------------------------------
Metadata:
    'description': 'Turkey'
    'id': 'seq1'
Stats:
    length: 42
------------------------------------------------
0 AAGCTNGGGC ATTTCAGGGT GAGCCCGGGC AATACAGGGT AT

Sequence
------------------------------------------------
Metadata:
    'description': 'Salmo gair'
    'id': 'seq2'
Stats:
    length: 42
------------------------------------------------
0 AAGCCTTGGC AGTGCAGGGT GAGCCGTGGC CGGGCACGGT AT

Sequence
------------------------------------------------
Metadata:
    'description': 'H. Sapiens'
    'id': 'seq3'
Stats:
    length: 42
------------------------------------------------
0 ACCGGTTGGC CGTTCAGGGT ACAGGTTGGC CGTTCAGGGT AA

Sequence
------------------------------------------------
Metadata:
    'description': 'Chimp'
    'id': 'seq4'
Stats:
    length: 42
------------------------------------------------
0 AAACCCTTGC CGTTACGCTT AAACCGAGGC CGGGACACTC AT

Sequence
------------------------------------------------
Metadata:
    'description': 'Gorilla'
    'id': 'seq5'
Stats:
    length: 42
------------------------------------------------
0 AAACCCTTGC CGGTACGCTT AAACCATTGC CGGTACGCTT AA

单个序列也可以读入 Sequence (或子类):

>>> from skbio import Sequence
>>> seq = Sequence.read(fl)
>>> seq
Sequence
------------------------------------------------
Metadata:
    'description': 'Turkey'
    'id': 'seq1'
Stats:
    length: 42
------------------------------------------------
0 AAGCTNGGGC ATTTCAGGGT GAGCCCGGGC AATACAGGGT AT

默认情况下,读取FASTA文件中的第一个序列。这可以用 seq_num . 例如,要读取第五个序列:

>>> seq = Sequence.read(fl, seq_num=5)
>>> seq
Sequence
------------------------------------------------
Metadata:
    'description': 'Gorilla'
    'id': 'seq5'
Stats:
    length: 42
------------------------------------------------
0 AAACCCTTGC CGGTACGCTT AAACCATTGC CGGTACGCTT AA

我们可以使用相同的API将第五个序列读入 DNA 顺序:

>>> dna_seq = DNA.read(fl, seq_num=5)
>>> dna_seq
DNA
------------------------------------------------
Metadata:
    'description': 'Gorilla'
    'id': 'seq5'
Stats:
    length: 42
    has gaps: False
    has degenerates: False
    has definites: True
    GC-content: 50.00%
------------------------------------------------
0 AAACCCTTGC CGGTACGCTT AAACCATTGC CGGTACGCTT AA

单个序列对象也可以用FASTA格式编写:

>>> with StringIO() as fh:
...     print(dna_seq.write(fh).getvalue())
>seq5 Gorilla
AAACCCTTGCCGGTACGCTTAAACCATTGCCGGTACGCTTAA

读写FASTA/QUAL文件

除了读写独立的FASTA文件外,scikit-bio还支持一起读写FASTA和QUAL文件。我们有以下文件:

>seq1 db-accession-149855
CGATGTC
>seq2 db-accession-34989
CATCGTC

另外,假设我们有以下QUAL文件:

>seq1 db-accession-149855
40 39 39 4
50 1 100
>seq2 db-accession-34989
3 3 10 42 80 80 79
>>> fasta_fl = [
...     ">seq1 db-accession-149855\n",
...     "CGATGTC\n",
...     ">seq2 db-accession-34989\n",
...     "CATCGTC\n"]
>>> qual_fl = [
...     ">seq1 db-accession-149855\n",
...     "40 39 39 4\n",
...     "50 1 100\n",
...     ">seq2 db-accession-34989\n",
...     "3 3 10 42 80 80 79\n"]

读单曲 Sequence 一次,我们可以像上面那样使用基于生成器的读取器,同时提供FASTA和QUAL文件:

>>> for seq in skbio.io.read(fasta_fl, qual=qual_fl, format='fasta'):
...     seq
...     print('')
Sequence
----------------------------------------
Metadata:
    'description': 'db-accession-149855'
    'id': 'seq1'
Positional metadata:
    'quality': <dtype: uint8>
Stats:
    length: 7
----------------------------------------
0 CGATGTC

Sequence
---------------------------------------
Metadata:
    'description': 'db-accession-34989'
    'id': 'seq2'
Positional metadata:
    'quality': <dtype: uint8>
Stats:
    length: 7
---------------------------------------
0 CATCGTC

注意,由于我们提供了一个QUAL文件,sequence对象将质量分数存储为位置元数据。其他FASTA阅读器也以类似的方式运行。

现在让我们将序列及其质量分数加载到 TabularMSA

>>> msa = TabularMSA.read(fasta_fl, qual=qual_fl, constructor=DNA)
>>> msa
TabularMSA[DNA]
---------------------
Stats:
    sequence count: 2
    position count: 7
---------------------
CGATGTC
CATCGTC

将序列数据和质量分数写入 TabularMSA 对于FASTA和QUAL文件:

>>> new_fasta_fh = StringIO()
>>> new_qual_fh = StringIO()
>>> _ = msa.write(new_fasta_fh, qual=new_qual_fh)
>>> print(new_fasta_fh.getvalue())
>seq1 db-accession-149855
CGATGTC
>seq2 db-accession-34989
CATCGTC

>>> print(new_qual_fh.getvalue())
>seq1 db-accession-149855
40 39 39 4 50 1 100
>seq2 db-accession-34989
3 3 10 42 80 80 79

>>> new_fasta_fh.close()
>>> new_qual_fh.close()

引用