這裡介紹何使用 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("路徑不是目錄。")
