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中操作MySQL入门实例
Feb 08 Python
详细探究Python中的字典容器
Apr 14 Python
讲解Python中的递归函数
Apr 27 Python
PyQt5主窗口动态加载Widget实例代码
Feb 07 Python
Django跨域请求问题的解决方法示例
Jun 16 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
Mar 27 Python
python抓取需要扫微信登陆页面
Apr 29 Python
python文件转为exe文件的方法及用法详解
Jul 08 Python
用Pelican搭建一个极简静态博客系统过程解析
Aug 22 Python
深入浅析Python 函数注解与匿名函数
Feb 24 Python
Python基于pandas绘制散点图矩阵代码实例
Jun 04 Python
Python环境使用OpenCV检测人脸实现教程
Oct 19 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添加图片水印、压缩、剪切的封装类
2015/08/17 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
JavaScript 10件让人费解的事情
2010/02/15 Javascript
围观tangram js库
2010/12/28 Javascript
兼容IE和Firefox火狐的上下、左右循环无间断滚动JS代码
2013/04/19 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
Javascript中浏览器窗口的基本操作总结
2016/08/18 Javascript
JS输出空格的简单实现方法
2016/09/08 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
2016/09/20 Javascript
JSON与String互转的实现方法(Javascript)
2016/09/27 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
Vue2路由动画效果的实现代码
2017/07/10 Javascript
Vue Cli与BootStrap结合实现表格分页功能
2017/08/18 Javascript
Angularjs实现上传图片预览功能
2017/09/01 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
2018/02/12 jQuery
JS简单表单验证功能完整示例
2020/01/26 Javascript
python中base64加密解密方法实例分析
2015/05/16 Python
python实现csv格式文件转为asc格式文件的方法
2018/03/23 Python
浅谈Pandas 排序之后索引的问题
2018/06/07 Python
python实现屏保程序(适用于背单词)
2019/07/30 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
HTML5 Web缓存和运用程序缓存(cookie,session)
2018/01/11 HTML / CSS
idealfit英国:世界领先的女性健身用品和运动衣物品牌
2017/11/25 全球购物
科级干部考察材料
2014/02/15 职场文书
幼儿园中班区域活动总结
2014/07/09 职场文书
捐书倡议书
2014/08/29 职场文书
学生保证书
2015/01/16 职场文书
2015入党自传格式范文
2015/06/26 职场文书
职工宿舍管理制度
2015/08/05 职场文书
详解如何在Canvas中添加事件的方法
2021/04/17 Javascript
Python绘制地图神器folium的新人入门指南
2021/05/23 Python
Pytest中conftest.py的用法
2021/06/27 Python
Vue3.0 手写放大镜效果
2021/07/25 Vue.js
Python机器学习实战之k-近邻算法的实现
2021/11/27 Python