2012-07-25 49 views
4

問題:的Python:如果找不到文件嘗試尋找不同的文件名

我有代碼,查找文件並打開它。默認情況下,它查找以#######開頭的文件(每個#是一個數字)。

問題有時文件名是##-#####和其他時間#####

我想找一個方法,如果文件無法找到試着尋找其他兩種方式的文件可以寫。

找不到文件時發生IOError異常。我想是有一個不同的聲明,上面寫着:

except File2: 
    Look for ##### in myfindFileFunction() 
    if file is still not found run except File3 
except File3: 
    Look for ##-#### in myfindFileFuction() 
except: 
    print "File not found" 

我什麼不知道的是如何設置自定義異常這樣的工作方式,和/或是否有做一個更Python的方式這一共...

會建立一個模式或三個可能的文件名,並迭代思考,直到文件被發現工作更好?

回答

5

使用try/except確實是一種非常pythonic(和快速)的做事方式。

你必須權衡,不僅是pythonic,但這種方法在可讀性方面有什麼影響。當您在6個月內再次查看代碼時,您是否仍然能夠快速理解代碼?會有其他人嗎?

我通常會確保稍微複雜的try/except子句來處理這類事情的評論很好。除此之外...這是一個完全合理的方式。另外,爲了讓你放心,關於性能,當你在兩種方法之間作出決定的時候,你需要關注一下:Python if vs try-except,你會發現try/except結構在Python中很快......真的快速。

+1

根據目錄中的文件數/多少個,這可能比針對每個文件名的更復雜的正則表達式運行慢得多。 'myFindFileFunction()'意味着每個異常情況都會迭代給定目錄中的文件,導致最壞情況循環遍歷每個文件名n次(n是候選文件名模式的數量)。相比之下,即使在最壞的情況下,一個一刀切的基於正則表達式的解決方案應該只需遍歷目錄中的文件名。 – 2012-07-25 16:49:57

3

沒有自定義異常需要

import errno 

try: 
    open('somefile') 
except IOError as e: 
    if e.errno == errno.ENOENT: 
     open('someotherfilename') 
    else: 
     raise e 

(這是* nix-林不知道,如果你正在使用Windows)

+0

如果我正確地閱讀它,這隻支持尋找一種其他類型的文件而不是其他兩種類型 – 2012-07-25 22:47:58

+0

@ user765015沒有理由不能繼續嵌套它 - 如果不同排列的數量是有限的。 – tMC 2012-07-26 12:47:20

1

這是很容易來定義自己的異常 - 只需創建一個類派生自Exception。多克很清楚。

但是,爲每個文件類型或任何異常創建單獨的例外似乎不是必需的。你可以這樣做:

 
files = ('#######', "##-#####', '#####') 

fh = None 
for f in files: 
    try: 
     fh = open(f) 
     break 
    except IOError as e: 
     if e.errno in (errno.ENOENT,): 
      pass 
     else: 
      raise 

if not fh: 
    ## all three tries failed 

各地e.errno採用if讓你決定哪些IO錯誤的意思去到下一個文件,哪些是你想了解的錯誤。文件不存在(errno.ENOENT)表示嘗試下一個文件。但其他人喜歡「太多文件打開」(errno.ENFILE)可能需要不同的響應。