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 相关文章推荐
Python列表和元组的定义与使用操作示例
Jul 26 Python
基于python的字节编译详解
Sep 20 Python
Django 跨域请求处理的示例代码
May 02 Python
对python中for、if、while的区别与比较方法
Jun 25 Python
Python selenium根据class定位页面元素的方法
Feb 26 Python
django框架ModelForm组件用法详解
Dec 11 Python
python调用c++返回带成员指针的类指针实例
Dec 12 Python
Python Switch Case三种实现方法代码实例
Jun 18 Python
python的数学算法函数及公式用法
Nov 18 Python
Python ellipsis 的用法详解
Nov 20 Python
python飞机大战游戏实例讲解
Dec 04 Python
pandas中pd.groupby()的用法详解
Jun 16 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
利用static实现表格的颜色隔行显示
2006/10/09 PHP
Windows下安装Memcached的步骤说明
2010/04/25 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
个人总结的一些关于String、Function、Array的属性和用法
2007/01/10 Javascript
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
Extjs中ComboBoxTree实现的下拉框树效果(自写)
2013/05/28 Javascript
使用jQuery实现input数值增量和减量的方法
2015/01/24 Javascript
jquery简单实现网页层的展开与收缩效果
2015/08/07 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
分分钟玩转Vue.js组件
2016/10/25 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
基于layer.js实现收货地址弹框选择然后返回相应的地址信息
2017/05/26 Javascript
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
使用Vuex解决Vue中的身份验证问题
2018/09/28 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
[01:13]DOTA2群星解读国服召集令 一起说出回归的理由
2013/07/17 DOTA
python访问类中docstring注释的实现方法
2015/05/04 Python
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
python中字符串前面加r的作用
2015/06/04 Python
Python网站验证码识别
2016/01/25 Python
django项目运行因中文而乱码报错的几种情况解决
2017/11/07 Python
Python实现可自定义大小的截屏功能
2018/01/20 Python
mac下pycharm设置python版本的图文教程
2018/06/13 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
python利用JMeter测试Tornado的多线程
2020/01/12 Python
python实现对变位词的判断方法
2020/04/05 Python
Python+unittest+requests+excel实现接口自动化测试框架
2020/12/23 Python
Java提供了哪些企业应用编程接口
2015/02/13 面试题
安全员岗位职责
2013/11/11 职场文书
三分钟演讲稿范文
2014/04/24 职场文书
让生命充满爱演讲稿
2014/05/10 职场文书
小学教师师德师风个人整改措施
2014/09/18 职场文书
初中班主任心得体会
2016/01/07 职场文书
职场新人刚入职工作总结该怎么写?
2019/05/15 职场文书
Java中多线程下载图片并压缩能提高效率吗
2021/07/01 Java/Android