這裡介紹何使用 Python 程式判斷指定的檔案或目錄是否已經存在。
在各種語言的程式設計上,檢查特定的檔案或目錄是否存在是一個很常見的工作,而在 Python 中也不利外,以下是在各種情況下檢查檔案或目錄的方法與範例。
如果您只是想單純檢查檔案存在與否,沒有需要馬上開啟的話,可以使用 os.path.isfile
:
import os # 要檢查的檔案路徑 filepath = "/etc/motd" # 檢查檔案是否存在 if os.path.isfile(filepath): print("檔案存在。") else: print("檔案不存在。")
os.path.isfile
對於一般檔案以及連結檔案都會傳回 True
,如果想判斷檔案是否屬於連結檔,可以再加上 os.path.islink
的判斷:
# 檢查是否為連結檔 if os.path.islink(filepath): print("連結檔。") else: print("非連結檔。")
若要檢查目錄是否存在,則可使用 os.path.isdir
,用法都相同:
import os # 要檢查的目錄路徑 folderpath = "/var/log" # 檢查目錄是否存在 if os.path.isdir(folderpath): print("目錄存在。") else: print("目錄不存在。")
os.path.isdir
對於目錄以及連結到目錄的連結檔都會傳回 True
,若要判斷是否為連結檔,同樣可使用 os.path.islink
。
若只是想要查看特定的路徑是否存在,不分檔案或目錄,則可使用 os.path.exists
:
import os # 要檢查的檔案路徑 filepath = "/etc/motd" # 檢查路徑是否存在 if os.path.exists(filepath): print("路徑存在。") else: print("路徑不存在。")
try
開啟檔案如果您是要在開啟檔案之前,檢查檔案是否存在,建議的作法是使用 try
的方式來嘗試開啟檔案,這樣可以避免在檢查與開啟檔案之間產生的意外狀況,例如:
# 要開啟的檔案路徑 filepath = "/etc/not-exists" # 使用 try 開啟 try: f = open(filepath, 'r') content = f.read() f.close() # 檔案不存在的例外處理 except FileNotFoundError: print("檔案不存在。") # 路徑為目錄的例外處理 except IsADirectoryError: print("該路徑為目錄")
在例外處理的部份,我們可以加上各種例外狀況的處理方式,在這裡我們將檔案不存在以及路徑為目錄的狀況分開處理。
try
建立目錄若要在目錄不存在時自動建立目錄,也可以直接使用 try
來建立目錄,並加上檔案已存在的例外處理即可:
import os # 建立的目錄路徑 folderpath = "/home/gtwang/my_folder" # 使用 try 建立目錄 try: os.makedirs(folderpath) # 檔案已存在的例外處理 except FileExistsError: print("檔案已存在。")
使用 try
的方式不但語法簡潔,而且可以處理多種例外狀況,是比較推薦的作法。
如果在程式測時發生沒有事先預期到的例外,程式可能就會輸出這樣的錯誤訊息(這是沒有寫入權限的錯誤):
Traceback (most recent call last): File "exists.py", line 8, in <module> os.makedirs(folderpath) File "/usr/lib/python3.5/os.py", line 231, in makedirs makedirs(head, mode, exist_ok) File "/usr/lib/python3.5/os.py", line 241, in makedirs mkdir(name, mode) PermissionError: [Errno 13] Permission denied: '/home/gtwang/my_folder'
如果想要在程式中也加入這個例外的處理,只要加上對應的例外名稱(在錯誤訊息中就可以看到),以及例外處理的程式碼即可:
import os folderpath = "/etc/gtwang/my_folder" try: os.makedirs(folderpath) except FileExistsError: print("檔案已存在。") # 權限不足的例外處理 except PermissionError: print("權限不足。")
pathlib
模組除了使用傳統的 os
模組來檢查檔案與目錄之外,也可以改用比較新的 pathlib
模組,以物件導向的方式撰寫,功能大同小異:
# 引入 pathlib 模組 from pathlib import Path # 檔案或目錄路徑 my_file = Path("/etc/os-release") # 檢查路徑是否存在 if my_file.exists(): print("路徑存在。") else: print("路徑不存在。") # 檢查路徑是否為檔案 if my_file.is_file(): print("路徑是檔案。") else: print("路徑不是檔案。") # 檢查路徑是否為目錄 if my_file.is_dir(): print("路徑是目錄。") else: print("路徑不是目錄。")
參考資料:StackOverflow