首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python 判斷檔案/目錄存在的完整指南:exists、isfile、isdir、lexists、FTP 遠端檢查與最佳實踐

     編輯:更多程式設計知識

檔案操作前的存在性檢查是防錯第一道防線。Python 提供 os.path 系列函數,但行為細節(符號連結、權限、遠端協議)常被忽略。本文系統整理 8 種檢查場景與最佳實踐。

核心函數對照表

函數用途回傳值符號連結行為
os.path.exists(path)路徑存在(檔案/目錄/連結)True/False跟隨連結檢查目標
os.path.isfile(path)是一般檔案True/False跟隨連結檢查目標
os.path.isdir(path)是目錄True/False跟隨連結檢查目標
os.path.lexists(path)路徑存在(含壞掉的連結)True/False不跟隨連結,連結本身存在即 True

基本用法範例


import os

path_dir = 'd:/assist'
path_file = 'd:/assist/getTeacherList.py'

print(os.path.exists(path_dir))      # True
print(os.path.exists(path_file))     # True
print(os.path.isfile(path_dir))      # False
print(os.path.isfile(path_file))     # True

# 建立多層目錄
os.makedirs('d:/assist/set', exist_ok=True)
print(os.path.exists('d:/assist/set'))  # True

進階場景與最佳實踐

1. 寫入前檢查:存在 + 是檔案 + 可讀


from os import path, access, R_OK

FILE = './data.txt'
if path.exists(FILE) and path.isfile(FILE) and access(FILE, R_OK):
    print("檔案存在且可讀")
else:
    print("檔案缺失或不可讀")

2. EAFP 風格:嘗試開啟捕獲例外(Python 推薦)


def file_exists(filename):
    try:
        with open(filename) as f:
            return True
    except IOError:
        return False

優點:避免 TOCTOU(檢查時與使用時狀態不一致)競態條件,碼風符合 Python「請求寬恕而非許可」哲學。

3. 符號連結特殊處理


# 建立指向不存在目標的連結
os.symlink('/not/exist', 'broken_link')

print(os.path.exists('broken_link'))   # False(目標不存在)
print(os.path.lexists('broken_link'))  # True(連結本身存在)

4. FTP 遠端檔案/目錄檢查


from ftplib import FTP, error_perm

ftp = FTP('ftp.example.com')
ftp.login('user', 'pass')

# 方法一:嘗試下載,捕獲權限錯誤
def ftp_file_exists(ftp, filename):
    try:
        ftp.voidcmd(f'SIZE {filename}')  # 僅查大小,不下載
        return True
    except error_perm:
        return False

# 方法二:列出目錄內容比對
def ftp_dir_exists(ftp, dirname):
    try:
        ftp.cwd(dirname)  # 嘗試切換
        ftp.cwd('..')     # 切回
        return True
    except error_perm:
        return False

# 方法三:MLSD 指令(現代 FTP 伺服器支援)
def ftp_list(ftp, path):
    try:
        return [entry for entry in ftp.mlsd(path)]
    except error_perm:
        return []

常見陷阱提醒

  • os.path.exists('') 回傳 False,但 open('') 會拋出異常
  • 網路掛載路徑(NFS/SMB)檢查可能因網路延遲卡住數秒
  • access() 檢查的是實際 UID/GID 權限,而非 effective 權限(setuid 程式需注意)
  • Python 3.4+ 建議改用 pathlib.Path 物件導向介面:
    from pathlib import Path
    p = Path('data.txt')
    p.exists(), p.is_file(), p.is_dir(), p.is_symlink()
    

選對檢查方式,能讓檔案操作更健壯、更符合 Python 風格。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved