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 相关文章推荐
使用rpclib进行Python网络编程时的注释问题
May 06 Python
Python映射拆分操作符用法实例
May 19 Python
web.py在SAE中的Session问题解决方法(使用mysql存储)
Jun 24 Python
asyncio 的 coroutine对象 与 Future对象使用指南
Sep 11 Python
Python去除、替换字符串空格的处理方法
Apr 01 Python
python url 参数修改方法
Dec 26 Python
在PyCharm下使用 ipython 交互式编程的方法
Jan 17 Python
python交互界面的退出方法
Feb 16 Python
网易有道2017内推编程题 洗牌(python)
Jun 19 Python
Django高级编程之自定义Field实现多语言
Jul 02 Python
Python正则表达式如何匹配中文
May 27 Python
keras分类模型中的输入数据与标签的维度实例
Jul 03 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
加速XP搜索功能堪比vista
2007/03/22 PHP
php 连接mssql数据库 初学php笔记
2010/03/01 PHP
php 字符串压缩方法比较示例
2014/01/23 PHP
PHP中date与gmdate的区别及默认时区设置
2014/05/12 PHP
使用xampp搭建运行php虚拟主机的详细步骤
2015/10/21 PHP
PHP多进程编程实例详解
2017/07/19 PHP
PHP使用函数用法详解
2018/09/30 PHP
PHP getName()函数讲解
2019/02/03 PHP
PHP使用反向Ajax技术实现在线客服系统详解
2019/07/01 PHP
理解JSON:3分钟课程
2011/10/28 Javascript
javascript图像处理—仿射变换深度理解
2013/01/16 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
AngularJS指令中的绑定策略实例分析
2016/12/14 Javascript
使用原生的javascript来实现轮播图
2017/02/24 Javascript
JS实现点击发送验证码 xx秒后重新发送功能
2019/07/30 Javascript
jQuery实现简单聊天室
2020/02/08 jQuery
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
js里面的变量范围分享
2020/07/18 Javascript
vue-router之解决addRoutes使用遇到的坑
2020/07/19 Javascript
js数组的基本使用总结
2021/01/18 Javascript
Python实现微信公众平台自定义菜单实例
2015/03/20 Python
python使用threading.Condition交替打印两个字符
2019/05/07 Python
PyQt5多线程刷新界面防假死示例
2019/12/13 Python
开发中都用到了那些设计模式?用在什么场合?
2014/08/21 面试题
驾驶员岗位职责
2014/01/29 职场文书
测控技术自荐信
2014/06/05 职场文书
2014领导班子专题民主生活会对照检查材料思想汇报
2014/09/23 职场文书
信息合作协议书
2014/10/09 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书
为什么中国式养孩子很累?
2019/08/07 职场文书
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python
为什么RedisCluster设计成16384个槽
2021/09/25 Redis
详解SQL报错盲注
2022/07/23 SQL Server