68.《Bioinformatics Data Skills》之使用pysam进行SAM/BAM文件处理(1)

Pysam作为一个python模块可以读取与处理SAM/BAM文件,并提供了方便的对象与丰富的操作接口,让我们了解一下。

首先,可以通过以下方式安装(官方文档):

$ pip install pysam

阅读官方文档并快速定位需要的内容是编写代码必备的技能,这里简单地介绍一下如何使用该模块进行文件的读取与read的遍历。

依然以NA12891_CEU_sample.bam文件为例,使用pysam包进行BAM文件的读取:

>>> import pysam
>>> fname = "NA12891_CEU_sample.bam"
>>> bamfile = pysam.AlignmentFile(filename = fname, mode = "rb")

这里的模式设定为"rb"代表读取二进制文件,如果为SAM文件设定为“r”即可,无论SAM还是BAM文件都会返回AlignmentFile对象并支持同样的操作。pysam的方法提供了高度的抽象,有很多我们不必关注的细节,例如它会自动读取当前文件相关的bai索引文件文件,所以使用别人开发好的库可以节约大量的时间并减少错误。

pysam.AlignmentFile.fetch方法可以提取特定区域,例如

>>> for read in bamfile.fetch("1", 215906528, 215906567):
...     print read.qname, " is aligned at ", read.pos
...
SRR005672.5788073  is aligned at  215906479
SRR005666.5830972  is aligned at  215906486
ERR002294.5383813  is aligned at  215906495
ERR002375.3090308  is aligned at  215906496
SRR001194.8524147  is aligned at  215906496
SRR005671.2372792  is aligned at  215906497
SRR005674.4540404  is aligned at  215906497

若没有设定区域,会对所有的read进行迭代,每次都会返回一个AlignmentSegment对象,该对象包含了每个BAM条目的所有信息。可以统计一些更具体的信息,例如观察每个read是否能比对到参考基因组:

>>> for read in bamfile:
>>>     status = "unaligned" if read.is_unmapped else "aligned"
>>>     print read.qname, " is ", status
...
SRR003218.11132930  is  aligned
ERR002067.6193238  is  aligned
ERR002291.4893931  is  aligned
ERR002291.4893931  is  unaligned
SRR002145.9802018  is  aligned
ERR001777.1596233  is  aligned
ERR001777.1596233  is  unaligned
SRR001159.2699414  is  aligned
...

这里有一个细节需要关注,那就是使用迭代(例如这里的for循环)读取文件内容时程序会记住停止的位置,下次再迭代这个对象会从上次结束的地方开始。其实这是python的常见规则,但是对于不熟悉python的人可能会被困扰。通过一个例子来说明:

下面的代码统计了所有read中匹配的数目:

>>> nmap = 0
>>> for read in bamfile:
...     nmap += not read.is_unmapped
...
>>> print nmap

使用next函数继续迭代时会报错:

>>> bamfile.next()
Traceback (most recent call last):
  File "", line 1, in 
  File "pysam/libcalignmentfile.pyx", line 1854, in pysam.libcalignmentfile.AlignmentFile.__next__
StopIteration

这是由于前面的迭代已经到达文件末尾,需要使用reset函数进行重置:

>>> bamfile.reset()
0

这样,我们再使用next函数得到的就是第一个read了:

>>> read = bamfile.next()
>>> read.qname
'SRR005672.8895'

最后,当我们使用完该对象的时候可以使用close函数进行关闭:

>>> read = bamfile.close()

你可能感兴趣的:(68.《Bioinformatics Data Skills》之使用pysam进行SAM/BAM文件处理(1))