2016-03-03 3 views
0

Я использовал pytabix для чтения через .gz-файлы. Я не уверен, что случилось с моим кодом, потому что он работал ранее:tabix.TabixError: запрос не выполнен

import tabix 

tb = tabix.open('qcat.gz') 
coor = "chr10:6000-30000" 
record = tb.querys(coor)             
for res in record:   
    print res 

Я получаю эту ошибку:

tabix.TabixError: query failed 

Это не похоже, как .tbi индексного файла делается ,

ответ

1

Перед запросом вам нужно выполнить предварительные условия tabix (bgzip, index). Они не включены в tb.query.

если файл уже заархивированы, то вы должны сделать:

zippedf ='qcat.gz' 
def tabix_index(zippedf) 
    from subprocess import Popen,PIPE 
    import shlex 
    p = Popen(['tabix','-f', zippedf], stdout= PIPE) 
    # or : cmd = "tabix -f " + zippedf 
    # p = Popen(shlex.split(cmd), stdout=PIPE) 
    #(shlex splits the cmd in spaces) 
    p.wait() 

В случае, если у вас есть не-архивный файл, который вы можете запустить 3 подпроцессов в ряд, чтобы сделать сортировку, bgzip и индекс:

out_sorted = 'myfile.sorted' 
out_zipped= out_sorted + ".gz" 

with open(out_zipped,'w') as sort_zip_out : 
    cmd="sort -V -k1,1 myfile" 
    p1 = Popen(shlex.split(cmd), stdout=PIPE) 
    p2 = Popen(['bgzip','-c','-f'], stdin=p1.stdout, stdout= sort_zip_out) 
    p1.stdout.close() #finish first subprocess before starting second 
    p1.wait() #wait for results to be written 

#when these two subprocesses are finished, 
tabix_index(out_zipped)