2013-08-07 60 views
0

我有一個文件,我必須做2件事情。首先計算一個特定的模式,如果計數超過5,我必須打印所有包含的行。查找模式,計數和打印

輸入文件:

0- 0:  2257042_7  2930711_14 
    0- 1:  2257042_8  2930711_13  
    0- 2:  2257042_9  2930711_12  
    0- 3:  2257042_10  2930711_11 
    0- 4:  2257042_11  2930711_10 
    0- 5:  2257042_13  2930711_8 
    0- 6:  2257042_14  2930711_7 
    0- 7:  2257042_15  2930711_6 
    0- 8:  2257042_16  2930711_5 
    1- 0:  2258476_3  2994500_2 
    1- 1:  2258476_4  2994500_3   
    1- 2:  2258476_5  2994500_4 
    1- 3:  2258476_6  2994500_5 
    1- 4:  2258476_7  2994500_6  
    2- 0:  2259527_1  2921847_10  
    2- 1:  2259527_2  2921847_9 
    2- 2:  2259527_3  2921847_8         
    2- 3:  2259527_4  2921847_7 
    2- 4:  2259527_5  2921847_6 
    2- 5:  2259527_6  2921847_5 
38- 0:  2323304_2  3043768_5 
38- 1:  2323304_3  3043768_6         
38- 2:  2323304_4  3043768_7          
38- 3:  2323304_5  3043768_8                  
38- 4:  2323304_6  3043768_9                  
38- 5:  2323304_7  3043768_10                  
38- 6:  2323304_8  3043768_11          
39- 0:  2323953_1  3045012_9         
39- 1:  2323953_2  3045012_8                  
39- 2:  2323953_3  3045012_7                  
39- 3:  2323953_4  3045012_6                  
39- 4:  2323953_7  3045012_3   
39- 5:  2323953_8  3045012_2   
40- 0:  2331568_2  3042876_8   
40- 1:  2331568_3  3042876_7   
40- 2:  2331568_4  3042876_6   
40- 3:  2331568_5  3042876_5   
40- 4:  2331568_6  3042876_4   
40- 5:  2331568_9  3042876_2   
40- 6:  2331568_10  3042876_1   

預期輸出:

0- 0:  2257042_7  2930711_14           
    0- 1:  2257042_8  2930711_13            
    0- 2:  2257042_9  2930711_12            
    0- 3:  2257042_10  2930711_11            
    0- 4:  2257042_11  2930711_10            
    0- 5:  2257042_13  2930711_8            
    0- 6:  2257042_14  2930711_7            
    0- 7:  2257042_15  2930711_6            
    0- 8:  2257042_16  2930711_5             
38- 0:  2323304_2  3043768_5            
38- 1:  2323304_3  3043768_6            
38- 2:  2323304_4  3043768_7             
38- 3:  2323304_5  3043768_8            
38- 4:  2323304_6  3043768_9            
38- 5:  2323304_7  3043768_10            
38- 6:  2323304_8  3043768_11            
40- 0:  2331568_2  3042876_8             
40- 1:  2331568_3  3042876_7            
40- 2:  2331568_4  3042876_6            
40- 3:  2331568_5  3042876_5            
40- 4:  2331568_6  3042876_4             
40- 5:  2331568_9  3042876_2            
40- 6:  2331568_10  3042876_1            

所以爲了這個,我已經把編碼放,我不知道是錯誤的這一點。我沒有得到預期的輸出。 編碼:

import sys                       
coll_file = open (sys.argv[1]).readlines() 
old_pattern = '' 

for lines in coll_file:   
      pattern_count = 0            
      split_line = lines.split('\t')    
      pattern = split_line[0]             
      if pattern == old_pattern: 
        pattern_count = pattern_count+1 
        if pattern_count > '5': 
          print lines.strip() 
          old_pattern = pattern 

回答

0

你必須使用一個緩衝器line_buffer來存儲線,如果下一模式是不同形式的前一個,並且如果先前的行數大於> 5,其打印出來。打印後,您必須初始化緩衝區。

如果圖案等於舊的圖案,計數+ = 1,否則設置計數爲1。

最後,仍然必須再次檢查計數,如果大於5,打印它。

就是這樣。

import sys 
coll_file = open(sys.argv[1]).readlines() 
old_pattern = '' 
line_buffer = [] 
pattern_count = 0 

for lines in coll_file: 
    lines = lines.rstrip('\n') 
    split_line = lines.split(' ') 
    pattern = split_line[0] 
    if pattern == old_pattern: 
     pattern_count = pattern_count + 1 
     line_buffer.append(lines) 
    elif pattern != old_pattern: 
     old_pattern = pattern 
     if pattern_count >= 5: 
      print '\n'.join(line_buffer) 
     line_buffer = [] 
     pattern_count = 1 
if pattern_count >= 5: 
    print '\n'.join(line_buffer) 
+0

它給我沒有輸出..我得到一個空白文件。 – rhkss

+0

你確定你的分割字符是'\ t'嗎?或者只是空間? –

+0

只有它的'\ t'..沒有空格.. – rhkss

0
  1. 比較int對象與對象str是沒有意義的。

    >>> 1 > '5' 
    False 
    >>> 10 > '5' 
    False 
    
  2. 以下條件將永不滿足,因爲old_pattern不會改變。

    pattern == old_pattern 
    
+0

請問我能解釋一下我的錯誤是什麼以及我應該做什麼改變。 – rhkss

0
import csv 
from collections import defaultdict 

d = defaultdict(list) 

with open('lines.txt') as f: 
    reader = csv.reader(f, delimiter='\t') 
    for row in reader: 
     d[row[0]].append(row) 

for k,v in d.iteritems(): 
    if len(v) > 5: 
     print(v)