2014-09-02 64 views
0

我有一個python代碼,我試圖將包含行中變體信息的文本文件轉換爲用於我的下游分析的變體調用格式文件(vcf)。將文本文件轉換爲VCF格式時出錯

我得到的一切正確,但當我試圖運行代碼我錯過了前兩個條目,我的意思是前兩行。代碼如下,突出顯示未讀取整個文件的行。我想要一些專家的建議。

我剛開始在python中編寫代碼,所以我不完全熟悉它。

##fileformat=VCFv4.0 
##fileDate=20140901 
##source=dbSNP 
##dbSNP_BUILD_ID=137 
##reference=hg19 
#CHROM POS  ID  REF  ALT  QUAL FILTER INFO 

import sys 

text=open(sys.argv[1]).readlines() 
print text 
print "First print" 
text=filter(lambda x:x.split('\t')[31].strip()=='KEEP',text[2:]) 
print text 
print "################################################" 
text=map(lambda x:x.split('\t')[0]+'\t'+x.split('\t')[1]+'\t.\t'+x.split('\t')[2]+'\t'+x.split('\t')[3]+'\t.\tPASS\t.\n',text) 
print text 
file=open(sys.argv[1].replace('.txt','.vcf'),'w') 

file.write('##fileformat=VCFv4.0\n') 
file.write('##source=dbSNP') 
file.write('##dbSNP_BUILD_ID=137') 
file.write('##reference=hg19\n') 
file.write('#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\n') 

for i in text: 
     file.write(i) 
     file.close() 

INPUT:

chrM 152 T C T_S7998 N_S8980 0 DBSNP COVERED 1 1 1 282 36 0 163.60287 0.214008 0.02 11.666081 202 55 7221 1953 0 0 TT 14.748595 49 0 1786 0 KEEP 
chr9 311 T C T_S7998 N_S8980 0 NOVEL COVERED 0.993882 0.999919 0.993962 299 0 0 207.697923 1 0.02 1.854431 0 56 0 1810 1 116 CC -44.649001 0 12 0 390 KEEP 
chr13 440 C T T_S7998 N_S8980 0 NOVEL COVERED 1 1 1 503 7 0 4.130339 0.006696 0.02 4.124606 445 3 16048 135 0 0 CC 12.942762 40 0 1684 0 KEEP 

OUTPUT期望:

##fileformat=VCFv4.0 
##source=dbSNP##dbSNP_BUILD_ID=137##reference=hg19 
#CHROM POS ID REF ALT QUAL FILTER INFO 
chrM 152 . T C . PASS . 
chr9 311 . T C . PASS . 
chr13 440 . C T . PASS . 

OUTPUT獲得:

##fileformat=VCFv4.0 
##source=dbSNP##dbSNP_BUILD_ID=137##reference=hg19 
#CHROM POS ID REF ALT QUAL FILTER INFO 
chr13 440 . C T . PASS . 

我想對如何糾正這個錯誤有一些幫助。

回答

1

有幾個問題與您的代碼

  1. 在您傳遞text[2:]filter功能。我想你想通過text獲得所有的行。
  2. 在寫入.vcf文件的最後一個循環中,您正在關閉循環內的文件。您應該首先編寫所有值,然後關閉循環外的文件。

所以,你的代碼看起來像(我刪除了所有的打印):

import sys 
text=open(sys.argv[1]).readlines() 
text=filter(lambda x:x.split('\t')[31].strip()=='KEEP',text) # Pass text 
text=map(lambda x:x.split('\t')[0]+'\t'+x.split('\t')[1]+'\t.\t'+x.split('\t')[2]+'\t'+x.split('\t')[3]+'\t.\tPASS\t.\n',text) 
file=open(sys.argv[1].replace('.txt','.vcf'),'w') 

file.write('##fileformat=VCFv4.0\n') 
file.write('##source=dbSNP') 
file.write('##dbSNP_BUILD_ID=137') 
file.write('##reference=hg19\n') 
file.write('#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\n') 

for i in text: 
    file.write(i) 
file.close() # close after writing all the values, in the end 
+0

感謝您的編輯。現在它工作正常 – 2014-09-02 12:02:26

+0

現在很好知道它的工作原理。接受答案,如果你認爲它對你有幫助! – sk11 2014-09-02 12:05:45