這裡介紹何使用 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