前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用pysam操作BAM文件

使用pysam操作BAM文件

作者头像
生信修炼手册
发布2020-12-24 11:06:43
1.7K0
发布2020-12-24 11:06:43
举报
文章被收录于专栏:生信修炼手册

pysam模块对samtools和tabix进行了封装,可以在python程序内部来操作和访问相关的文件,具体地,支持以下4种文件

1. Fasta/Fastq

2. VCF

3. Tabix file

4. BAM/CRAM/SAM

对于samtools的封装,提现在操作bam文件上,既可以通过编程来读取bam文件中的内容,也可以实现samtools的调用;对tabix的封装,体现在利用索引来提取对应区域的record。

1. Fasta和Fastq

Fasta和Fastq,也常称为fastx格式,对于读取而言,pysam提供了以下接口

代码语言:javascript
复制
>>> with pysam.FastxFile(fastq) as f:
...   for entry in f:
...      print(entry.name)
...     print(entry.sequence)
...     print(entry.comment)
...     print(entry.quality)

该接口同时适用于fastq和fasta,只不过对于fasta而言,没有quality和comment属性。

对于有fai索引的fasta文件,还可以通过fetch函数来提取对应region的碱基,此时的读取方式如下

代码语言:javascript
复制
>>> import pysam
>>> fasta = pysam.FastaFile('input.fasta')
>>> fasta.references
['chr1', 'chr2', 'chr3', 'chr4', 'chr5']
>>> fasta.filename
'input.fasta'
>>> fasta.nreferences
5
>>> fasta.lengths
[248956422, 242193529, 198295559, 190214555, 181538259]
>>> fasta.get_reference_length('chr1')
248956422

通过对应的属性,可以方便获取染色体名称,长度,个数等属性,fetch通过指定染色体,起始和终止位置来定义region,用法如下

代码语言:javascript
复制
>>> region = fasta.fetch('chr1', 20000, 20100)
>>> region
'CCTGGTGCTCCCACAAAGGAGAAGGGCTGATCACTCAAAGTTGCGAACACCAAGCTCAACAATGAGCCCTGGAAAATTTCTGGAATGGATTATTAAACAG'

2. VCF

对于VCF文件,可以通过如下方式遍历所有的记录

代码语言:javascript
复制
>>> vcf = pysam.VariantFile('dbsnp.hg19.vcf')
>>> for i in vcf:
...     print(i.chrom)
...     print(i.id)
...     print(i.ref)

对于vcf的头文件,可以通过如下方式访问

代码语言:javascript
复制
>>> vcf.header
<pysam.libcbcf.VariantHeader object at 0x7f4cf923f190>
>>> print(vcf.header)
##fileformat=VCFv4.1
##FILTER=<ID=PASS,Description="All filters passed">
>>> list(vcf.header.contigs)
['chrM', 'chr1', 'chr2', 'chr3', 'chr4', 'chr5']
>>> list(vcf.header.filters)
['PASS', 'NC']
>>> list(vcf.header.info)
['ASP', 'ASS', 'CAF', 'CDA', 'CFL', 'CLNACC', 'CLNALLE', 'CLNDBN', 'CLNDSDB', 'CLNDSDBID', 'CLNHGVS', 'CLNORIGIN', 'CLNSIG', 'CLNSRC', 'CLNSRCID', 'COMMON', 'DSS', 'G5', 'G5A', 'GENEINFO', 'GNO', 'HD', 'INT', 'KGPROD', 'KGPhase1', 'KGPilot123', 'KGValidated', 'LSD', 'MTP', 'MUT', 'NOC', 'NOV', 'NSF', 'NSM', 'NSN', 'OM', 'OTH', 'OTHERKG', 'PH3', 'PM', 'PMC', 'R3', 'R5', 'REF', 'RS', 'RSPOS', 'RV', 'S3D', 'SAO', 'SLO', 'SSR', 'SYN', 'TPA', 'U3', 'U5', 'VC', 'VLD', 'VP', 'WGT', 'WTD', 'dbSNPBuildID']

对于有tbi索引的vcf文件,还可以通过fetch函数来访问特定region的记录,用法如下

代码语言:javascript
复制
>>> for i in vcf.fetch('chr1', 1000, 2000):
...     print(i.id)

3. Tabix

tabix支持对bed, gff, bam, vcf等多种文件建立索引,这里的Tabix的意思是专指对于bed, gff这两种纯文本格式的文件的处理,主要功能是使用fetch来提取对应region的记录,用法如下

代码语言:javascript
复制
>>> bed = pysam.TabixFile("hg19.bed")
>>> for row in bed.fetch('chr1', 1000, 2000):
...     print(str(row))

4. BAM

对于Bam文件,遍历行的操作如下

代码语言:javascript
复制
>>> bam = pysam.AlignmentFile('input.bam')
>>> for i in bam:
...     print(i.qname)
...     print(i.flag)

同时,还可以通过fetch和pileup两种方式来访问,fetch访问区域的alignment,用法如下

代码语言:javascript
复制
>>> for i in bam.fetch('chr1', 10000, 20000):
...     print(i.qname)
...     print(i.flag)

pileup访问基因组每个碱基的比对情况,用法如下

代码语言:javascript
复制
>>> for i in bam.pileup('chr1', 10000, 20000):
...     print(i.reference_name)
...     print(i.pos)
...     print(i.nsegments)

从形式上看,两种方法差不多,但是其返回值为不同Class的对象,可以根据API来访问具体的属性和方法。

除了访问操作,也可以调用samtools的功能,因为pysam是对samtools的封装,所以samtools的子命令在该模块中,可以通过函数形式来调用,用法如下

代码语言:javascript
复制
>>> print(pysam.view.usage())

Usage: samtools view [options] <in.bam>|<in.sam>|<in.cram> [region ...]

Options:
  -b output BAM
  -C output CRAM (requires -T)
  -1       use fast BAM compression (implies -b)
  -u uncompressed BAM output (implies -b)
  -h include header in SAM output
  -H print SAM header only (no alignments)
------
>>> pysam.view('-o', 'out.bam', 'accepted_hits.bam')

如果需要对上述几种文件根据指定区域提取子集,或者针对bam文件进行更加个性化的统计处理,可以使用pysam来实现,集成到python开发环境中,实现更加复杂的逻辑处理,会更加的高效。

·end·

—如果喜欢,快分享给你的朋友们吧—

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信修炼手册 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档