2013-08-27 79 views
1

我想比較多個文件(15-20),這些文件是gzip,並從它們中恢復行,這是常見的。但這並非如此簡單。這些行在某些列中是精確的,我也希望他們能夠統計出它們存在的文件數量。如果是1,則該行對於文件是唯一的,等等。同樣也很好地保存這些文件名。多文件比較

每個文件看起來ST這樣的:

##SAMPLE=<ID=NormalID,Description="Cancer-paired normal sample. Sample ID 'NORMAL'"> 
##SAMPLE=<ID=CancerID,Description="Cancer sample. Sample ID 'TUMOR'"> 
#CHROM POS  ID  REF  ALT  QUAL FILTER INFO FORMAT NormalID_NORMAL CancerID_TUMOR 
chrX 136109567  .  C  CT  .  PASS IC=8;IHP=8;NT=ref;QSI=35;QSI_NT=35;RC=7;RU=T;SGT=ref->het;SOMATIC;TQSI=1;TQSI_NT=1;phastCons;CSQ=T|ENSG00000165370|ENST00000298110|Transcript|5KB_downstream_variant|||||||||YES|GPR101|||||  DP:DP2:TAR:TIR:TOR:DP50:FDP50:SUBDP50 23:23:21,21:0,0:2,2:21.59:0.33:0.00 33:33:16,16:13,13:4,4:33.38:0.90:0.00 
chrX 150462334  .  T  TA  .  PASS IC=2;IHP=2;NT=ref;QSI=56;QSI_NT=56;RC=1;RU=A;SGT=ref->het;SOMATIC;TQSI=2;TQSI_NT=2;CSQ=A||||intergenic_variant||||||||||||||| DP:DP2:TAR:TIR:TOR:DP50:FDP50:SUBDP50 30:30:30,30:0,0:0,0:31.99:0.00:0.00  37:37:15,17:16,16:6,5:36.7:0.31:0.00 

文件是製表符分隔。 如果行以#開頭,則忽略此行。我們只對那些不感興趣的人感興趣。 以0爲基礎的python座標,我們感興趣的是0,1,2,3,4域。他們必須在文件之間進行匹配才能被報告爲通用。但是,我們仍然需要tohold有關coulmns /其餘字段的信息,使他們可以現在寫托特他的輸出文件

我有以下代碼:

import gzip 
filenames = ['a','b','c'] 
files = [gzip.open(name) for name in filenames] 

sets = [set(line.strip() for line in file if not line.startswith('#')) for file in files] 
common = set.intersection(*sets) 
for file in files: file.close() 
print common 

在我currenyt代碼我做不知道如何正確地實現如果不是line.startswith()(哪個位置?),以及如何指定應匹配的行中的列。更何況,我不知道如何獲得例如6個文件中存在的行,或者存在於總共15個文件中的10行中。 對此有何幫助?

回答

1

收集在一本字典的線,使他們相似的關鍵領域:

from collections import defaultdict 
d = defaultdict(list) 

def process(filename, line): 
    if line[0] == '#': 
     return 

    fields = line.split('\t') 
    key = tuple(fields[0:5]) # Fields that makes lines similar/same 
    d[key].append((filename, line)) 

for filename in filenames: 
    with gzip.open(filename) as fh: 
     for line in fh: 
      process(filename, line.strip()) 

現在,你有文件名行的元組列表的字典。你現在可以打印所有出現超過10次的行:

for l in d.values(): 
    if len(l) < 10: continue 

    print 'Same key found %d times:' % len(l) 

    for filename, line in l: 
     print '%s: %s' % (filename, line) 
+0

我有以下問題:TypeError:不可用類型:'list'行:d [key] .append和process(filename [.. 。] – Irek

+0

嗯,是的,嘗試'key = tuple(fields [0:5])' –

+0

這是個很好的答案,這個概念從一開始就被理解了,我會用很好的輸出來玩弄自己(btw current一個已經非常好,並允許非常簡單的過濾)。非常感謝 – Irek