2011-05-13 74 views
2

嗨 我是新來的蟒蛇,我有一個3.2蟒蛇! 我有具有某種格式的這樣一個文件:如何計算python文件中兩個字符之間的行數?

Number of segment pairs = 108570; number of pairwise comparisons = 54234 
'+' means given segment; '-' means reverse complement 

Overlaps   Containments No. of Constraints Supporting Overlap 

******************* Contig 1 ******************** 

E_180+ 

E_97- 

******************* Contig 2 ******************** 

E_254+ 

        E_264+ is in E_254+ 

E_276+ 

******************* Contig 3 ******************** 

E_256- 

E_179- 

我想算之間的非空行數* ****重疊羣# * * * * ,我想這樣的

contig1=2 
contig2=3 
contig3=2** 

回答

3

可能是一個結果,它是st在這裏使用正則表達式。你可以嘗試以下方法:

import re 
str = open(file).read() 
pairs = re.findall(r'\*+ (Contig \d+) \*+\n([^*]*)',str) 

pairs是元組,其中元組有形式的列表('Contig x', '...') 每個元組的第二個組件包含標記後的文本

之後,你可以算這些文本中'\n'的編號;

[(contig, txt.count('\n')) for (contig,txt) in pairs] 

(編輯:如果你不想算空行,你可以試試:

[(contig, txt.count('\n')-txt.count('\n\n')) for (contig,txt) in pairs] 

+0

非常感謝這真的很簡單,正是我想要的! – Mahmood 2011-05-17 15:08:55

0
def give(filename): 
    with open(filename) as f: 
     for line in f: 
      if 'Contig' in line: 
       category = line.strip('* \r\n') 
       break 
     cnt = 0 
     aim = [] 
     for line in f: 
      if 'Contig' in line: 
       yield (category+'='+str(cnt),aim) 
       category = line.strip('* \r\n') 
       cnt = 0 
       aim= [] 
      elif line.strip(): 
       cnt+=1 
       if 'is in' in line: 
        aim.append(line.strip()) 
     yield (category+'='+str(cnt),aim) 


for a,b in give('input.txt'): 
    print a 
    if b: print b 

最容易這可以通過列表解析完成結果

Contig 1=2 
Contig 2=3 
['E_264+ is in E_254+'] 
Contig 3=2 

函數give()不是一個正常的函數,它是一個生成器函數。看文檔,如果你有問題,我會回答。

strip()是,在開始時和在一個字符串

的末端消除字符時沒有自變量使用的功能,strip()刪除空格(即\f\n\r\t\vblank space)。當有一個字符串作爲參數時,在處理過的字符串中找到的字符串參數中存在的所有字符將從處理過的字符串中移除。字符串參數中的字符順序無關緊要:這樣的參數不會指定一個字符串,而是一組要刪除的字符。

line.strip()是知道是否有不在行空格字符的方式

elif line.strip():是行if 'Contig' in line:後位於,並且它是寫ELIF,而不是如果事實,是很重要的:如果是相反的,line.strip()將是行是用於爲例

******** Contig 2 *********\n 

我想你會有興趣知道的線路像這樣的內容:

  E_264+ is in E_254+ 

,因爲它是這種線,使在countings 所以我編輯我的代碼不同,以該功能give()也產生這些類型的信息

+0

謝謝!但我無法使用give()命令,而phynfo答案對我來說是完美的! – Mahmood 2011-05-17 15:11:08

相關問題