2014-12-04 54 views
1

我讀一個文件,並使用try catch來趕情況下,該數據可能不是我要找的類型:使用try除python - 成本是多少?

for w in text.readlines(): 
    try: 
     new = float(w.split()[3].replace(',', '.')) 
     if new < temp and w.split()[1][3:5] == '12': 
      temp = new 
      date = w 
    except ValueError: 
     '' 
    except IndexError: 
     '' 

這確實是一個哈克的解決方案,而不是東西,我會用,只是我寫的東西,因爲我需要快速訪問一些數據。但是,如果我想分析一個非常大的文件或流,那麼這樣的解決方案(修改是否使調用更智能等)是可行的,或者應該選擇其他解決方案。我的主要問題是關於嘗試捕捉的表現,是否是一種昂貴的操作,並且是否有嘗試除了良好用法的指導原則?希望這個問題不太寬泛。如果是,請關注我的示例。

+1

習慣性的python看起來像那樣。請求寬恕不允許。 – RedX 2014-12-04 13:37:50

+7

但是使用'pass'而不是''''來表示「什麼也不做」! – 2014-12-04 13:40:32

+2

此外,你可以'except(ValueError,IndexError):'如果案件之間沒有區別。你應該儘可能縮短'try'塊。 – jonrsharpe 2014-12-04 13:48:35

回答

1

在你給特定的例子,你可以很容易地測試,避免IndexError情況下,所以我會做測試。 ValueError很難檢查,所以你應該捕獲異常。

for w in text: 
    words = w.split() 
    if len(words) >= 4: 
     try: 
      new = float(words[3].replace(',', '.')) 
      if new < temp and words[1][3:5] == '12': 
       temp = new 
       date = w 
     except ValueError: 
      pass 

不要使用readlines()上的一個文件,你應該只遍歷文件來代替。

一個好的經驗法則是,在處理異常之前同樣容易檢查或處理異常時,應考慮拋出異常的頻率。如果在正常情況下,異常觸發很少,那麼就處理它,另一方面,如果它是常見情況,那麼避免拋出它可能會更好。由於我對數據一無所知,因此我不知道比例的線將少於4個字段,所以在這種情況下,選擇是非常隨意的。

+0

感謝您的回答,以及關於迭代文件的提示。我看到你是一位Python專家,關心我指向一些好的資源/鏈接也變成了一個更好的Python程序員?我來自Java和C背景。 – 2014-12-04 22:35:13

1

我不能說太多關於它,因爲我不是專家,但它是alwyas更好地在你看來,代碼可能會產生一些錯誤的任何codeing語言使用try except,並在Python詞彙 EAFP規則明確表示它。

更容易要求原諒而不是權限。這種常見的Python編碼風格假定存在有效的鍵或屬性,並且如果假設證明是錯誤的,則捕獲異常。這種乾淨而快速的風格的特點是存在許多嘗試和除外聲明。該技術與許多其他語言一樣的LBYL風格形成鮮明對比,如C.

for w in text.readlines(): 
    try: 
     new = float(w.split()[3].replace(',', '.')) 
     if new < temp and w.split()[1][3:5] == '12': 
      temp = new 
      date = w 
    except ValueError: 
     Do Something 
    except IndexError: 
     Do Something 
    except Exception: #Exception is a Base class of all exceptions if any exception that isn't catch will go in it, 
     Do Something 
+2

當沒有特別的理由期待雜項異常並且沒有針對它們的具體處理時,捕捉並忽略'異常'是一個壞主意。 – Duncan 2014-12-04 13:57:23

+0

@Duncan感謝您考慮這個問題,我只是想解釋一下,因爲OP在發生異常時沒有說出如何處理。我的錯。 – 2014-12-04 14:02:08

+0

有趣的小知識:在Python 2.x中,Exceptions不*必須從'BaseException'派生。你也可以'舉起'舊式的課堂。 – 2014-12-04 14:10:41