2016-08-17 68 views
1

我必須檢查多個文件的存在和可讀性。哪種做法最有效?`open(fname,'r')。close()`和`os.path.isfile(fname)'之間的區別`

list_of_files = [fname1,fname2,fname3] 
for fname in list_of_files: 
    try: 
     open(fname, 'r').close() 
    except IOError: 
     raise YourCustomError 

list_of_files = [fname1,fname2,fname3] 
for fname in list_of_files: 
    if not ps.path.isfile(fname): 
     raise YourCustomError 
+1

'os.access()'? https://docs.python.org/2/library/os.html#os.access –

回答

1

有一個共同的理念 - 執行並請求原諒比前手請求許可。

第一種方法試圖以可讀模式打開文件,如果文件不存在或不可讀,則會失敗。操作失敗後,我們要求原諒。

在第二種方法中,我們只是首先要求許可。然而,你的第二個例子只是檢查它是否是一個文件,不檢查權限。

但是,使用上下文管理器(with open(filename, "r"))可能是一種更好的方法,而不是手動關閉文件處理程序。

1

我必須檢查多個文件的存在和可讀性。哪種做法最有效?

這不僅僅是一個效率的問題,因爲你的兩種方法不會做同樣的事情。例如,一個文件可能是exist and be unreadable to you,因爲有權限。您的第一種方法是實際檢查文件是否開放和可讀的兩種方法中的唯一方法(至少在某個時間點 - 您的方法都有競爭條件)。

2

如果您計劃在使用那些文件然後既不。您的電話和使用該文件時可能會刪除文件或更改權限,從而使該信息過時。而不是僅僅嘗試使用文件和處理出現異常:

try: 
    with open(fname, 'r') as f: 
     # use f 
except FileNotFoundError as e: 
    # file was deleted 
except IsADirectoryError as e: 
    # path exists but is a directory 
except PermissionError as e: 
    # you don't have permissions to read the file 
except OSError as e: 
    # other error 

然而,如果你正在編寫中顯示有關權限給用戶的信息的工具,則是有意義的使用規定的方法和功能特別是這個目的,所以你應該使用os.path.existsos.is_fileos.is_dir

如果您正在處理整個目錄,請注意使用os.scandir並檢查DirEntry的對象上的方法會更有效。

相關問題