使用pysam操作VCF BCF檔案

2021-09-29 03:41:55 字數 2594 閱讀 4290

讀取和寫出

from pysam import variantfile

bcf_in = variantfile("test_in.vcf", "r")

bcf_out = variantfile("test_out.vcf", "w", header=bcf_in.header)

for rec in bcf_in.fecth():

bcf_out.write(rec)

variantfile函式得到的是pysam.libcbcf.variantfile物件, 這是乙個可遍歷物件, 通過dir()可以發現它有__iter____next__方法。因此如果僅僅是遍歷全部記錄,那麼__iter__等價於fecth.

type(bcf_in) # 物件型別

dir(bcf_out) # 方法

vcf格式分為header和record兩個部分. record記錄每個變異位點的具體資訊,為了從中提取所需資料,需要理解pysam的解析策略。

rec1 = bcf_in.__next__()

dir(rec1)

vcf的record每一行都是9列+n列樣本(chrom, pos, id, ref, alt, qual, filter, info, format, sample1, sample2,..), 解析之後就是如下方法

.filter, .info, .format, .samples雖然都能返回類字典(或者說雜湊表)資料結果,但是在方法上存在差別。

variantrecordfilter物件可以通過.filter.add增加過濾型別, 當然需要事先在header中新增元資訊,如下:

bcf_in.header.filters.add(id="ugly",number=none, type=none,description="i don't likt it") #增加員資訊

rec = bcf_in.__next__()

rec.filter.add("ugly") # 增加過濾條件

rec.filter.keys() # 檢視

variantrecordinfo物件可以刪除乙個鍵值對(pop),可以更新已有的鍵值對。

rec.info.pop('type') # 刪除type

rec.info['odds'] # 變更前

rec.info.update() #變更

rec.info['odds'] # 變更後

variantrecordformat和variantrecordsamples關係比較緊密,但前者只能檢視不提供方法進行修改, 而variantrecordsamples和variantrecordinfo一致。由於可以有多個樣本,提取資料的時候就需要多層迭代,例如提取所有樣本的gt

for key,value in rec.samples.iteritems():

print(key, value['gt'])

例如只有兩個樣本,我想比較這兩個樣本的gt是否相同

gt = [value['gt'] for value in rec.samples.values()]

gt[0].__eq__(gt[-1])

綜上,就可以在python中寫出乙個過濾器剔除缺失基因組記錄,保留其中樣本基因組純合但不同的記錄

import sys

from pysam import variantfile as vcf

if len(sys.ar**) < 3:

sys.exit(1)

else:

in_name = sys.ar**[1]

out_name = sys.ar**[2]

bcf_in = vcf(in_name)

# add metadata

command = "##pysamcommand=gt[0].__ne__((none,)) and gt[-1].__ne__((none,)) and gt[0].__ne__(gt[-1]) and gt[0].__ne__((0,1)) and gt[-1].__ne__((0,1))"

bcf_in.header.add_line(command)

bcf_out = vcf(out_name, "w", header=bcf_in.header)

for rec in bcf_in.__iter__():

gt = [value['gt'] for value in rec.samples.values()]

if gt[0].__ne__((none,)) and gt[-1].__ne__((none,)) and \

gt[0].__ne__((0,1)) and gt[-1].__ne__((0,1)) and \

gt[0].__ne__(gt[-1]):

bcf_out.write(rec)

fso使用操作

fso方法使用說明 set fso server.createobject scripting.filesystemobject fso檔案 顯示檔案列表 set f fso.getfolder folderspec set fc f.files for each f1 in fc s s f1.n...

操作使用分析

表示式的值為多少?15 嗎?16 嗎?18 嗎?對於這種情況,語言標準並沒有作出規定。有的編譯器計算出來為18,因為i 經過3 次自加後變為6,然後3 個6 相加得18 而有的編譯器計算出來為16 比如visual c 6.0,gcc,g 先計算前兩個i 的和,這時候i自加兩次,2 個i 的和為10...

Git使用操作

簡明一句介紹git 分布式版本控制系統,充當 專案或者筆記 等等文件 的版本記錄者。粑粑再也不用擔心你找不到兄弟姐妹啦 git安裝apt get install git root使用者安裝,非root使用者前面加上 sudo 在開始選單中找到安裝的git,git git bush,彈出乙個類似命令視...