基因组与Python --PyVCF 好用的vcf文件处理器
vcf文件的全称是variant call file,即突变识别文件,它是基因组工作流程中产生的一种文件,保存的是基因组上的突变信息。通过对vcf文件进行分析,可以得到个体的变异信息。嗯,总之,这是很重要的文件,所以怎么处理它也显得十分重要。它的文件信息如下:
文件的开头是一堆以“##”开始的注释行,包含了文件的基本信息。然后是以“#”开头的一行,共9+n个部分,前九部分标注的是后面行每部分代表的信息,相当于表头。后面部分是样本名称,可以有多个。注释行结束后是具体的突变信息,每一行分为9+n个部分,每部分之间用制表符(‘\t’)分隔。
通常处理vcf文件时,在读取,处理阶段总是会写很多重复代码,核心的任务代码很少。当然,如果仅仅是找位点的CHROM,POS,ID,REF,ALT,QUAL这几个参数时,这样做也可以。因为vcf格式规范,这几个参数的结构相对简单。但是如果处理头文件信息,或者处理INFO,FORMAT参数时,要写比较复杂的正则表达式,这样做不仅繁琐,而且容易出错。
Python的PyVCF库解决了这个问题,它通过正则表达式把vcf文件信息转换成结构化的信息,简化了vcf文件的处理过程,方便后续提取相关参数及处理。
PyVCF库的安装,cmd界面:
- pip install PyVCF
或者从https://github.com/jamescasbon/PyVCF网站上下载安装包,自行安装。
PyVCF库的导入:
- import vcf
PyVCF库的名字为vcf,导入之后可以使用其方法对vcf文件做处理。
PyVCF库详细介绍:
使用实例:
- >>> import vcf
- >>> vcf_reader = vcf.Reader(filename=r'D:\test\example.hc.vcf.gz')
- >>> for record in vcf_reader:
- print record
- Record(CHROM=chr1, POS=10146, REF=AC, ALT=[A])
- Record(CHROM=chr1, POS=10347, REF=AACCCT, ALT=[A])
- Record(CHROM=chr1, POS=10439, REF=AC, ALT=[A])
- Record(CHROM=chr1, POS=10492, REF=C, ALT=[T])
- Record(CHROM=chr1, POS=10583, REF=G, ALT=[A])
调用vcf.Reader类处理vcf文件,vcf文件信息就被保存到vcf_reader中了。它是一个可迭代对象,它的迭代元素都是一个_Record对象的实例,保存着非注释行的一行信息,即变异位点的具体信息。通过它,我们可以很轻易地得到位点的详细信息。
_Record对象------位点信息的储存形式
- class vcf.model._Record(CHROM, POS, ID, REF, ALT, QUAL, FILTER, INFO, FORMAT, sample_indexes, samples=None)
_Record是vcf.model中的一个对象,除了它还有_Call,_AltRecord等对象。它的基本属性为CHROM,POS,ID,REF,ALT,QUAL,FILTER,INFO,FORMAT,也就是vcf中的一行位点信息。接下来对这些属性一一说明:
- >>> for record in vcf_reader:
- print type(record.CHROM), record.CHROM
- print type(record.POS), record.POS
- print type(record.ID), record.ID
- print type(record.REF), record.REF
- print type(record.ALT), record.ALT
- print type(record.QUAL), record.QUAL
- print type(record.FILTER), record.FILTER
- print type(record.INFO), record.INFO
- print type(record.INFO['BaseQRankSum']), record.INFO['BaseQRankSum']
- print type(record.FORMAT), record.FORMAT
- <type 'str'> chr1
- <type 'int'> 234481
- <type 'NoneType'> None
- <type 'str'> T
- <type 'list'> [A]
- <type 'float'> 2025.77
- <type 'NoneType'> None
- <type 'dict'> {'ExcessHet': 3.0103, 'AC': [1], 'BaseQRankSum': -2.743, 'MLEAF': [0.5], 'AF': [0.5], 'MLEAC': [1], 'AN': 2, 'FS': 2.371, 'MQ': 42.83, 'ClippingRankSum': 0.0, 'SOR': 0.972, 'MQRankSum': -2.408, 'ReadPosRankSum': 1.39, 'DP': 156, 'QD': 13.07}
- <type 'float'> -2.743
- <type 'str'> GT:AD:DP:GQ:PL
- >>> for record in vcf_reader:
- print record.samples, '\n', record.samples[0].sample, '\n', record.samples[0]['GT'] #按下标访问Call,按.sample访问sample,按键访问FORMAT对应信息
- print record.start, record.POS, record.end
- print record.REF, record.ALT, record.alleles #注意G没有引号,它是_AltRecord对象
- [Call(sample=192.168.1.1, CallData(GT=0/1, AD=[39, 14], DP=53, GQ=99, PGT=0|1, PID=13116_T_G, PL=[449, 0, 2224]))]
- 192.168.1.1
- 0/1
- 13115 13116 13116
- T [G] ['T', G]
- >>> record = next(vcf_reader)
- >>> record2 = next(vcf_reader)
- >>> print record > record2 #按染色体名称和位置进行比较
- False
- >>> for i in record: #按samples列表进行迭代
- print i
- Call(sample=192.168.1.1, CallData(GT=0/1, AD=[18, 11], DP=29, GQ=99, PL=[280, 0, 528]))
- >>> print str(record) #字符串方法
- Record(CHROM=chr1, POS=10492, REF=C, ALT=[T])
- >>> print record.genotype('192.168.1.1') #按sample名字进行访问
- Call(sample=192.168.1.1, CallData(GT=0/1, AD=[39, 14], DP=53, GQ=99, PGT=0|1, PID=13116_T_G, PL=[449, 0, 2224]))
- >>> record = next(vcf_reader)
- >>> print record
- Record(CHROM=chr1, POS=13118, REF=A, ALT=[G])
- >>> print record.samples #只有一个sample
- [Call(sample=192.168.1.1, CallData(GT=0/1, AD=[41, 13], DP=54, GQ=99, PGT=0|1, PID=13116_T_G, PL=[449, 0, 2224]))]
- >>> record.num_called
- 1
- >>> record.call_rate
- 1.0
- >>> record.num_hom_ref
- 0
- >>> record.aaf
- [0.5]
- >>> record.num_het
- 1
- >>> record.heterozygosity
- 0.5
- >>> record.var_type
- 'snp'
- >>> record.var_subtype
- 'ts'
- >>> record.is_snp
- True
- >>> record.is_indel
- False
Reader对象------处理vcf文件,构建结构化信息
- class Reader(fsock=None, filename=None, compressed=None, prepend_chr=False, strict_whitespace=False, encoding='ascii')
在读vcf文件时,总共有六个参数可供选择,如上图所示。
prepend_chr:在保存染色体名称时,是否加前缀‘chr’,默认不加,如果vcf文件的染色体名称本来没有前缀‘chr’,可设置为True,自动加上。
- >>> vcf_reader = vcf.Reader(open('vcf/test/example-4.0.vcf', 'r')) #fsock
- >>> vcf_reader = vcf.Reader(filename=r'D:\test\example.hc.vcf.gz') #filename
头文件信息主要保存在Reader对象的属性中,包括alts,contigs,filters,formats,infos,metadata。
- >>> vcf_reader = vcf.Reader(filename=r'D:\test\example.hc.vcf.gz')
- >>> vcf_reader.alts
- OrderedDict([('NON_REF', Alt(id='NON_REF', desc='Represents any possible alternative allele at this location'))]) #字典类型
- >>> vcf_reader.alts['NON_REF'].id
- 'NON_REF'
- >>> vcf_reader.alts['NON_REF'].desc
- 'Represents any possible alternative allele at this location'
- >>> vcf_reader = vcf.Reader(filename=r'D:\test\example.hc.vcf.gz')
- >>> vcf_reader.next()
- <vcf.model._Record object at 0x0000000003ED8780>
- >>> record = vcf_reader.next()
- >>> print record
- Record(CHROM=chr1, POS=10347, REF=AACCCT, ALT=[A])
- >>> for record in vcf_reader:
- print record
- Record(CHROM=chr1, POS=10439, REF=AC, ALT=[A])
- Record(CHROM=chr1, POS=10492, REF=C, ALT=[T])
这个库还有一个Writer对象,在此就不详细介绍了,因为大部分对vcf文件的处理都可以用上面两个对象的知识搞定。
综合使用:
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- import vcf # 导入PyVCF库
- filename = r'D:\test\example.hc.vcf.gz'
- vcf_reader = vcf.Reader(filename=filename) # 调用Reader对象处理vcf文件
- for record in vcf_reader: # 迭代Reader对象,返回的是_Record对象
- # record是_Record对象
- print record.CHROM, record.POS, record.ID, record.ALT
- if record.is_snp:# 判断是否是snp
- print "I'm a snp"
- elif record.var_type != 'sv': #和 elif record.is_sv:等价
- print "I'm not a sv"
- if record.heterozygosity == 0.5: # 判断是否为杂合突变
- print "I'm a heterozygous mutation"
- ...
- ...
这个库实现的所有功能,都可以自己写代码实现,而且实现方法比较简单。之所以要用这个库来处理vcf文件,是因为这个库考虑的东西可能比我们自己了解的更多,其实现也可能比我们自己的代码更加完备合理。
基因组与Python --PyVCF 好用的vcf文件处理器的更多相关文章
- python实现将android手机通讯录vcf文件转化为csv
经常会遇到将手机通讯录导出到电脑并转化为在电脑中可编辑的情况,在网上搜索了很久当前不外乎两种处理方式.1.使用电脑的outlook的通讯簿功能,将手机导出的vcf文件导入到outlook的通讯录中,然 ...
- python通用读取vcf文件的类(可以直接复制粘贴使用)
前言 处理vcf文件的时候,需要多种切割,正则匹配,如果要自己写其实会比较麻烦,并且每次还得根据vcf文件格式或者需要读取的值不同要修改相应的代码.因此很多人会选择一些python的vcf的库,但 ...
- python起的 simpleHTTPServer服务传输文件
python起的 simpleHTTPServer服务传输文件 经同事的介绍,在Linux上传输文件的一种特别方便的方法: python -m SimpleHTTPServer [端口] 端口不填 默 ...
- Python搜索目录下指定的文件,并返回绝对路径(包括子目录)
#!/usr/bin/python #coding=UTF-8 #FileName:search.py #文件搜索 import os; import sys; returnList = []; de ...
- python使用xlrd模块读写Excel文件的方法
本文实例讲述了python使用xlrd模块读写Excel文件的方法.分享给大家供大家参考.具体如下: 一.安装xlrd模块 到python官网下载http://pypi.python.org/pypi ...
- python学习笔记(六)文件夹遍历,异常处理
python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...
- python模块介绍- xlwt 创建xls文件(excel)
python模块介绍- xlwt 创建xls文件(excel) 2013-06-24磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 ...
- /usr/bin/python^M: 解释器错误: 没有那个文件或目录
遇见问题 因为linux在虚拟机中,所以就在本地敲python代码,敲完后再拿到虚拟机去执行,再输入./filename.py时,就遇到这样的一个问题: bash: ./filename.py: /u ...
- python入门(5)使用文件编辑器编写代码并保存执行
python入门(5)使用文件编辑器编写代码并保存执行 两款文本编辑器: 一个是Sublime Text,免费使用,但是不付费会弹出提示框: 一个是Notepad++,免费使用,有中文界面: 请注意, ...
随机推荐
- php Allocator Jemalloc TCMalloc那个内存分配器比较好?
php Allocator Jemalloc TCMalloc那个内存分配器比较好? php一键安装脚本可以选择是否安装内存优化 You have 3 options for your Memory ...
- 怎样从外网访问内网Django?
本地安装了一个Django,只能在局域网内访问,怎样从外网也能访问到本地的Django呢?本文将介绍具体的实现步骤. 准备工作 安装并启动Django 默认安装的Django端口是8000. 实现步骤 ...
- sqlserver搜索中怎么把varchar类型转换成numeric类型
sqlserver搜索中怎么把varchar类型转换成numeric类型 可以用cast来转换 如:列名叫grade,表名为A select cast(grade as numeric(y,x)) f ...
- SpringMVC配置字符编码过滤器CharacterEncodingFilter来解决表单乱码问题
1.GET请求 针对GET请求,可以配置服务器Tomcat的conf\server.xml文件,在其第一个<Connector>标签中,添加URIEncoding="UTF-8& ...
- linux+nginx+mysql+php环境下,安装ecshop
我们在工作过程中要经常和电商打交道,所以,学会安装ecshop是必须的. 下面我们来介绍一下ecshop的安装. nginx和php安装整合,在我前面的文章中有提到,这里就不做赘述了.mysql可以使 ...
- MySQL PXC集群部署
安装 Percona-XtraDB-Cluster 架构: 三个节点: pxc_node_0 30.0.0.196 pxc_node_1 30.0.0.198 pxc_node_2 30.0.0.19 ...
- truncate table很慢之enq: RO - fast object reuse和local write wait等待分析
使用ASSM表空间(默认模式)的时候,在dss系统中确实会出现truncate很慢的现象,但是他不会100%重现,得看概率.通过sql trace(对任何v$sysstat看起来资源消耗很低的情况,都 ...
- memset与malloc性能测试(转)
前一段跟同事聊项目组已有的一些工具,同事讲里面有太多的malloc与memset,对性能的影响比较大,因此今天就在自己的机器上测试了这两个函数,不多说,上数据.测试环境:2.2GHZ.2G内存mems ...
- 谈论linux同组多用户操作问题
同组多用户,最先起到什么作用这个我也是不明白的, 然后乱搞了一堆, 下面我做个笔记帮组日后分析. 一个用户组承载多个用户, 像这样 这是我原先的思路.然后就是chenglee用户和chenglee12 ...
- linux判断文件大小
第一条code ll -s | tail -n +2 | awk '$1 >= 10 {print $1,$10 "容量大于10"} $1 <= 9 {print $1 ...