2010-06-02 73 views
0

我有我想分析的數據行。 的數據是這樣的:在Python中用分隔符分析行

a score=216 expect=1.05e-06 
a score=180 expect=0.0394 

我想要做的是有一個子程序 是解析它們和返回值2(得分和期望)爲 每一行。

但是我的這個功能似乎並沒有工作:

def scoreEvalFromMaf(mafLines): 
    for word in mafLines[0]: 
     if word.startswith("score="): 
      theScore = word.split('=')[1] 
      theEval = word.split('=')[2] 
      return [theScore, theEval] 
    raise Exception("encountered an alignment without a score") 

請指點什麼是應該做的正確方法?

+0

順便說一句,從來沒有養'Exception',因爲這是不可能的三立抓住它隨時增加更多的東西窄,像'ValueError'或者是你創建的。 – 2010-06-02 04:29:33

回答

2

它看起來像你想分開每一個空格,分別解析每個塊。如果mafLines是一個字符串從.readlines()(即一行:。

def scoreEvalFromMafLine(mafLine): 
    theScore, theEval = None, None 
    for word in mafLine.split(): 
     if word.startswith("score="): 
      theScore = word.split('=')[1] 
     if word.startswith("expect="): 
      theEval = word.split('=')[1] 

    if theScore is None or theEval is None: 
     raise Exception("Invalid line: '%s'" % line) 

    return (theScore, theEval) 

你在做它會遍歷在第一線的每個字符(因爲它是一個字符串列表),而不是在每個空間的方式

+0

@AB:嗨,託尼,謝謝。但是我也收到了同樣的信息'「error:'list'object has no attribute'split'」'using the snippet。 – neversaint 2010-06-02 01:47:33

+0

然後'mafLines'是列表列表,而不是字符串列表。我假設''mafLines'是從'.readlines()'或類似的輸出,但如果不是,你需要弄清楚它究竟是什麼,或者你是如何生成的。 – 2010-06-02 02:07:32

+0

我修正了它:'「爲單詞在mafLine [0]:」' – neversaint 2010-06-02 02:22:32

2

如果mafLines如果是一行行的列表,並且您只想看第一個行,則可以使用.split那行代碼來獲取單詞。例如:

def scoreEvalFromMaf(mafLines): 
    theScore = None 
    theEval = None 
    for word in mafLines[0].split: 
     if word.startswith('score='): 
      _, theScore = word.partition('=') 
     elif word.startswith('expect='): 
      _, theEval = word.partition('=') 
    if theScore is None: 
     raise Exception("encountered an alignment without a score") 
    if theEVal is None: 
     raise Exception("encountered an alignment without an eval") 
    return theScore, theEval 

注意,這會返回一個元組有兩個物品;如果你想要一個整數和浮點數,例如,你需要的最後一行改爲

return int(theScore), float(theEval) 

,然後你會得到一個ValueError異常,如果任一字符串是它應該代表類型無效,如果兩個字符串都有效,則返回帶有兩個數字的元組。

+0

@AM:嗨,亞歷克斯,謝謝,但我明白了essage'「錯誤:'list'對象沒有屬性'split'」'。順便說一句,這是存儲函數輸出的正確方法:'[score,exp] = scoreEvalFromMaf(maf)' – neversaint 2010-06-02 01:41:08

+1

聽起來像mafLines是列表列表而不是字符串列表。你是如何產生它的?你需要使用'.split()'(即它是一個函數調用),並且也可以使用'word.split('=')'而不是'單詞。分區('=')' – 2010-06-02 01:43:42

+1

@neversaint,你肯定需要澄清那個神祕的'mafLines' **是**, - 可能是列表的列表,正如Anthony所說的(給出錯誤信息),但不知道你是如何構建它的,根本不可能「讀出你的想法」,只憑空想象那些作品是神聖的。是的,一旦你澄清了這一點,你可以(如果你願意)將這些無用的括號放在作業右邊的'score,exp'。 – 2010-06-02 01:59:44

1

強制性的,可能不恰當的正則表達式的解決方案:

import re 
def scoreEvalFromMaf(mafLines): 
    return [re.search(r'score=(.+) expect=(.+)', line).groups() 
      for line in mafLines] 
+1

這將爆炸無效輸入(儘管這可能是你想要的行爲)。將你的'(。+)'變成'(。*)'有助於捕獲空白值,但是對於真正不友好的輸入仍然會死。 – 2010-06-02 02:14:30

+0

夠正確。這只是一個替代戰略的快速和骯髒的演示。 – harto 2010-06-02 03:58:06