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中类的定义与使用
Apr 11 Python
python enumerate函数的使用方法总结
Nov 15 Python
简单了解python模块概念
Jan 11 Python
python list格式数据excel导出方法
Oct 31 Python
python绘制已知点的坐标的直线实例
Jul 04 Python
python 通过邮件控制实现远程控制电脑操作
Mar 16 Python
python except异常处理之后不退出,解决异常继续执行的实现
Apr 25 Python
Python文件夹批处理操作代码实例
Jul 21 Python
Python 的 __str__ 和 __repr__ 方法对比
Sep 02 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
Nov 13 Python
Django前后端分离csrf token获取方式
Dec 25 Python
python 如何执行控制台命令与操作剪切板
May 20 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 读取和修改大文件的某行内容的代码
2009/10/30 PHP
php在多维数组中根据键名快速查询其父键以及父键值的代码
2011/05/07 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
2014/07/25 PHP
PHP实现事件机制的方法
2015/07/10 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
2016/07/25 PHP
Laravel框架下载,安装及路由操作图文详解
2019/12/04 PHP
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
深入领悟JavaScript中的面向对象
2013/11/18 Javascript
JavaScript 中有关数组对象的方法(详解)
2016/08/15 Javascript
JS实现自动阅读单词(有道单词本添加功能)
2016/11/14 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
用 js 写一个 js 解释器过程详解
2019/08/02 Javascript
js代码实现轮播图
2020/05/04 Javascript
wxpython 学习笔记 第一天
2009/02/09 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
2017/12/20 Python
Python动态生成多维数组的方法示例
2018/08/09 Python
numpy 对矩阵中Nan的处理:采用平均值的方法
2018/10/30 Python
python dataframe向下向上填充,fillna和ffill的方法
2018/11/28 Python
对python 中class与变量的使用方法详解
2019/06/26 Python
python单例模式原理与创建方法实例分析
2019/10/26 Python
浅谈在django中使用redirect重定向数据传输的问题
2020/03/13 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
临床医师专业个人自我评价范文
2013/11/07 职场文书
幼儿园小班植树节活动方案
2014/03/04 职场文书
合伙经营协议书范本
2014/04/18 职场文书
儿童生日会策划方案
2014/05/15 职场文书
小学家长学校培训材料
2014/08/24 职场文书
后勤管理员岗位职责
2014/08/27 职场文书
争先创优心得体会
2014/09/12 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL
Python可视化学习之seaborn绘制矩阵图详解
2022/02/24 Python