python通用读取vcf文件的类(复制粘贴即可用)


Posted in Python onFebruary 29, 2020

前言

处理vcf文件的时候,需要多种切割,正则匹配,如果要自己写其实会比较麻烦,并且每次还得根据vcf文件格式或者需要读取的值不同要修改相应的代码。因此很多人会选择一些python的vcf的库,但是首先你得安装这个库, 并且有一些库它固定了能够读的内容,如果你的vcf的信息不在它固定的里面,就读不出来。比如最近我想读一个样本的AF,但是它放在最后样本的GT那列,不在INFO那一列,有一些库竟然无能为力。因此我写了这个通用的读vcf的类,直接复制粘贴这部分代码就可以方便的用这个类进行vcf文件的读取,过滤,写出等操作。

使用说明

首先复制类的代码,后面就可以直接用了

import sys
import osimport subprocess
class Record(object):
 '''
 One line information in vcf file
 '''
 def __init__(self, line):
 info = line.split("\t")
 self.line = line
 self.CHROM = info[0] 
 self.POS = info[1]
 self.ID = info[2]
 self.REF = info[3]
 self.ALT = info[4]
 self.QUAL = info[5]
 self.FILTER = info[6]
 self.INFO = [{pair_lst[0]: pair_lst[1] if len(pair_lst)> 1 else ""} for pair_lst in [pair.split("=") for pair in info[7].split(";")]]
 self.FORMAT = info[8].split(":")
 self.sample_num = len(info) -7
 self.GT = []
 for i in range(2):
 GT_value = info[8 + i +1].split(":") 
 GT_dict = {}
 for g in range(len(GT_value)):
 GT_dict[self.FORMAT[g]] = GT_value[g] 
 self.GT.append(GT_dict) 
class VCF(object):
 '''
 VCF class, read VCF, write VCF, get VCF information
 '''
 def __init__(self, uncompress_vcf):
 self.header = []
 self.reader = open(uncompress_vcf, 'r')
 self.line = self.reader.readline().strip()
 while self.line.startswith('#'):
 self.header.append(self.line)
 self.line = self.reader.readline().strip()
 self.record = Record(self.line) 
 def __iter__(self): 
 return self 
 def __next__(self): 
 self.line = self.reader.readline().strip()
 if self.line != "":
 self.record = Record(self.line) 
 return self.record
 else:
 self.reader.close()
 raise StopIteration()
 def reader_close(self):
 self.reader.close()
  • 主要有两个类,一个是VCF类,存储的是vcf的信息,及对vcf文件的操作,一个是Record类,它包括vcf某一行存储的全部信息
  • 读入vcf文件
gatk_result = "realignment.vcf"
gatk = VCF(gatk_result)

查看vcf的header

gatk.header

查看vcf当前行中储存的信息,一开始是首行。它以Record这个类保存的。注意VCF类是个迭代器类,可以用next和for循环来读入每一行的信息

record = gatk.record #这里record存储的是该Record类的地址

查看该record的属性,包括line(行的内容,方便写出某行), CHROM, POS, ID,REF,ALT, QUAL, FILTER, INFO(字典的形式存储), FORMAT, sample_num(多少个样本),GT(样本的基因型信息,这里在vcf一般是在后面用样本名表示的列)

record.CHROM
record.line
record.ID #其他的属性同理

INFO的读取

这是vcf中INFO的原始表示

CONTQ=28;DP=38;ECNT=1;GERMQ=76;MBQ=20,37;MFRL=171,229;MMQ=60,60;MPOS=26;NALOD=1.16;NLOD=3.91; POPAF=6.00;RCNTS=0,0;ROQ=14;SEQQ=1;STRANDQ=11;TLOD=4.56

它在record中的存储形式

record.INFO [{'CONTQ': '28'}, {'DP': '38'}, {'ECNT': '1'}, {'GERMQ': '76'}, {'MBQ': '20,37'}, {'MFRL': '171,229'}, {'MMQ': '60,60'}, {'MPOS': '26'}, {'NALOD': '1.16'}, {'NLOD': '3.91'}, {'POPAF': '6.00'}, {'RCNTS': '0,0'}, {'ROQ': '14'}, {'SEQQ': '1'}, {'STRANDQ': '11'}, {'TLOD': '4.56'}]

GT的读取

这是GT在vcf的存储形式,FORMAT对应着GT的值

GT:AD:AF:DP:F1R2:F2R1:OBAM:OBAMRC:OBF:OBP:OBQ:OBQRC:SB 0/1:21,2:0.120:23:7,1:13,1:false:true:0.500:0.078:100.00:41.80:12,9,1,1 0/0:13,0:0.065:13:7,0:6,0:false:false:.:.:.:.:10,3,0,0 分别是FORMAT, tumor样本GT, normal样本GT对应的值

这是在record中的存储形式

record.GT [{'GT': '0/1', 'OBQRC': '41.80', 'SB': '12,9,1,1', 'DP': '23', 'OBF': '0.500', 'OBAM': 'false', 'OBP': '0.078', 'AD': '21,2', 'F2R1': '13,1', 'F1R2': '7,1', 'AF': '0.120', 'OBQ': '100.00', 'OBAMRC': 'true'}, {'GT': '0/0', 'OBQRC': '.', 'SB': '10,3,0,0', 'DP': '13', 'OBF': '.', 'OBAM': 'false', 'OBP': '.', 'AD': '13,0', 'F2R1': '6,0', 'F1R2': '7,0', 'AF': '0.065', 'OBQ': '.', 'OBAMRC': 'false'}]

第一个字典就是tumor的GT,第二个字典就是normal的GT,当然,根据你的样本数量会有多个字典,这里可以按索引取出比如要取出第一个样本的,只需要record.GT[0]就行

把tumor AF大于0.5的line打印出来

for record in gatk:
 # compare GATK tumor AF to 0.05
 if float(record.GT[0]['AF']) > 0.05:
 print(record.line)

把FILTER为PASS的并且tumor AF>0.05写入列表并写出最后的VCF文件

snv = "filter.vcf"
result = gatk.header
for record in gatk:
 if record.FILTER == "PASS" and float(record.GT[0]['AF']) > 0.05:
 result.append(record.line)
# write out result
with open(snv, 'w+') as snvf:
 for line in result:
 print(line, file = snvf)

查看gatk的下一个record, 因为VCF类是可迭代的,因此除了for也支持next

record = next(gatk)
print(record.line)

到此这篇关于python通用读取vcf文件的类(可以直接复制粘贴使用)的文章就介绍到这了,更多相关python vcf文件的类内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Linux中Python 环境软件包安装步骤
Mar 31 Python
Python简单定义与使用字典dict的方法示例
Jul 25 Python
pandas groupby 分组取每组的前几行记录方法
Apr 20 Python
python实现守护进程、守护线程、守护非守护并行
May 05 Python
Python 类的特殊成员解析
Jun 20 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
Jul 04 Python
pytorch 图像预处理之减去均值,除以方差的实例
Jan 02 Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 Python
使用PyTorch实现MNIST手写体识别代码
Jan 18 Python
Python实现文件压缩和解压的示例代码
Aug 12 Python
Django前后端分离csrf token获取方式
Dec 25 Python
Python Selenium库的基本使用教程
Jan 04 Python
Python编程快速上手——疯狂填词程序实现方法分析
Feb 29 #Python
Python使用GitPython操作Git版本库的方法
Feb 29 #Python
如何使用python代码操作git代码
Feb 29 #Python
使用 Python 遍历目录树的方法
Feb 29 #Python
python 已知一个字符,在一个list中找出近似值或相似值实现模糊匹配
Feb 29 #Python
在python3中实现查找数组中最接近与某值的元素操作
Feb 29 #Python
python pandas移动窗口函数rolling的用法
Feb 29 #Python
You might like
深入PHP中的HashTable结构详解
2013/06/13 PHP
php接口与接口引用的深入解析
2013/08/09 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
Javascript 判断Flash是否加载完成的代码
2010/04/12 Javascript
jquery 读取页面load get post ajax 四种方式代码写法
2011/04/02 Javascript
JavaScript中数组的排序、乱序和搜索实现代码
2011/11/30 Javascript
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
js定时调用方法成功后并停止调用示例
2014/04/08 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
微信小程序实现商品属性联动选择
2019/02/15 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
Vue 实现拨打电话操作
2020/11/16 Javascript
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
python通过apply使用元祖和列表调用函数实例
2015/05/26 Python
python 时间戳与格式化时间的转化实现代码
2016/03/23 Python
使用python装饰器计算函数运行时间的实例
2018/04/21 Python
python 3.6.2 安装配置方法图文教程
2018/09/18 Python
django fernet fields字段加密实践详解
2019/08/12 Python
python使用配置文件过程详解
2019/12/28 Python
django admin后管定制-显示字段的实例
2020/03/11 Python
Python使用Excel将数据写入多个sheet
2020/05/16 Python
python实现无边框进度条的实例代码
2020/12/30 Python
澳大利亚波西米亚风情网上商店:Czarina
2019/03/18 全球购物
在购买印度民族服饰:Soch
2020/09/15 全球购物
函数指针的定义是什么
2016/08/14 面试题
企业门卫岗位职责
2013/12/12 职场文书
集团公司人力资源部岗位职责
2014/01/03 职场文书
获奖的大学生创业计划书
2014/01/05 职场文书
大学毕业感言一句话
2014/02/06 职场文书
经典促销广告词大全
2014/03/19 职场文书
护理学院专科毕业生求职信
2014/06/28 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript
Go语言特点及基本数据类型使用详解
2022/03/21 Golang
Golang 并发编程 SingleFlight模式
2022/04/26 Golang