在 Python 中檢查文件或文件夾是否存在的 7 種方法

已發表: 2021-06-16

Python 標準庫包含開發人員解決問題所需的大部分功能。 在本教程中,您將學習僅使用內置模塊檢查文件或目錄是否存在的不同方法。

檢查文件或腳本是否位於正確的位置對於任何 CLI 程序都至關重要。 如果特定文件在執行時不在位,您的程序可能會變得無用。

在今天的教程中,您將學習一些在 Python 中檢查文件或文件夾是否存在的快速方法。

在開始之前

在執行以下任何命令之前,請確保您的系統中安裝了 Python 3。 打開終端並輸入以下命令:

 python --version # Python 3.9.5, my result

如果您有 2.x 版本,則需要使用“python3”命令。 如果您沒有安裝 Python 3,請查看我們的 Python 安裝指南。

我們將在本教程中使用一些測試文件,因此請確保創建以下文件:

 touch testfile.txt mkdir testdirectory/ touch testdirectory/otherfile.txt

上面的命令創建了一個文件,一個 testing 目錄,以及testingdirectory 中的另一個文件。 這些文件可以是空的,因為我們不需要讀取它們的內容,

注意:如果您使用的是 Windows,請使用圖形文件管理器設置該文件的簡單文件結構。

最後,我們將使用 Ipython 作為我們的交互式 Python shell,它提供了一個漂亮的界面來使用。 這只是一種商品,因此不是絕對必要的。

 pip install ipython

完成此操作後,您只需鍵入ipython即可訪問漂亮的 Python shell。

運行 Python 3.9 的 Ipython 交互式 shell

現在你已經準備好了,讓我們深入研究檢查 Python 中是否存在文件夾或文件的方法。

嘗試、打開和除外

這是最直接的選擇。 如果您嘗試打開一個不存在的文件,Python 將引發 FileNotFoundError。

 In [1]: open('im-not-here.txt') --------------------------------------------------------------------------- FileNotFoundError: [Errno 2] No such file or directory: 'im-not-here.txt'

我們可以利用這一點,並在我們要查找的文件不存在的情況下處理異常。

 In [2]: try: ...: file = open('im-not-here.txt') ...: print(file) # File handler ...: file.close() ...: except FileNotFoundError: ...: print('Sorry the file we\'re looking for doesn\' exist') ...: exit() ...: Sorry the file we're looking for doesn't exist

在上面的代碼中,我們打印自定義消息並在文件不存在時停止程序的執行。

請注意exit()函數如何僅在引發異常時執行。 讓我們看看當我們要查找的文件實際存在時會發生什麼。

 In [2]: try: ...: file = open('testfile.txt') ...: print(file) # File handler ...: file.close() ...: except FileNotFoundError: ...: print('Sorry the file we\'re looking for doesn\'t exist') ...: exit() ...: <_io.TextIOWrapper name='testfile.txt' mode='r' encoding='UTF-8'>

請注意我們是如何在打開文件後立即關閉它的。 根據 Python 文檔,這被認為是一種很好的做法。

調用<span class="pre">file.write()</span>而不使用<span class="pre">with</span>關鍵字或調用<span class="pre">file.close()</span>可能會導致<span class="pre">file.write()</span>沒有完全寫入磁盤,即使程序成功退出。

即使我們不寫入文件,也強烈建議關閉文件,因為這可能會導致多個性能問題。

如果我們不想自己關閉文件,我們可以使用with上下文管理器。 它精確地分配和釋放資源,因此我們不需要關閉文件。

 In [3]: try: ...: with open('testfile.txt') as file: ...: print(file) ...: # No need to close the file ...: except FileNotFoundError: ...: print('Sorry the file we\'re looking for doesn\'t exist') ...: exit() ...: ...: <_io.TextIOWrapper name='testfile.txt' mode='r' encoding='UTF-8'>

這種方法在寫入文件時非常有用,但如果我們只想檢查文件是否存在,則會導致效率低下。 讓我們深入研究實現這一目標的其他選項。

os.path.exists()

os 模塊提供了多種與操作系統交互的功能。 要檢查文件或文件夾是否存在,我們可以使用路徑。 exists()函數接受文件或目錄的路徑作為參數。 它根據路徑的存在返回一個布爾值。

注意:路徑是文件或目錄在文件系統中的唯一位置

在 Python 中, os.path 子模塊包含專門設計用於處理文件路徑的函數。 所有這些函數都接受作為字符串或字節的路徑參數,您可以決定使用絕對路徑,例如:

 /home/daniel/.bashrc

或者使用相對路徑,具體取決於您運行腳本的目錄:

 .bashrc # Running the script in my home folder

以下是使用os.path.exists()函數的多個示例,在我的測試文件所在的目錄中運行:

 In [1]: import os In [2]: os.path.exists('testfile.txt') Out[2]: True In [3]: os.path.exists('testdirectory') Out[3]: True In [4]: os.path.exists('hey-i-dont-exist') Out[4]: False

如您所見,當使用testfile.txt文件和testdirectory文件夾進行測試時,它返回True ,當文件不存在時返回False

os.path.isfile()

如果您只想證明文件(而不是目錄)的存在,則可以調用os.path.isfile()函數。

 In [1]: import os In [2]: os.path.isfile('testfile.txt') Out[2]: True In [3]: os.path.isfile('testdirectory/') Out[3]: False In [4]: os.path.isfile('i-dont-even-exist') Out[4]: False In [5]: os.path.isfile('testdirectory/otherfile.txt') Out[5]: True

注意:在 UNIX 中,所有目錄都以正斜杠 (/) 結尾,而在 Windows 中,我們使用反斜杠 (\)。

在上面的代碼中, isfile()函數有兩次返回False ,讓我們看看為什麼:

  • testdirectory/是一個目錄,因此它不被視為文件。 這不是絕對正確的,因為在 Linux 中一切都是文件描述符,但 Python 只是為了方便而以不同的方式對待目錄(如果您嘗試打開目錄,您將收到IsADirectoryError
  • i-dont-even-exist指向一個具有諷刺意味的不存在的文件

os.path.isdir()

如果你想檢查一個目錄是否在正確的位置,你需要使用os.path.isdir()函數,如果給定的路徑指向一個目錄,它只會返回True

 In [1]: import os In [2]: os.path.isdir('testfile.txt') Out[2]: False In [3]: os.path.isdir('testdirectory') Out[3]: True In [4]: os.path.isdir('anotherfile.txt') Out[4]: False

請注意上面的示例如何即使路徑指向存在的文件也返回False

球體

glob 模塊提供了使用類 Unix shell 模式的函數(因此它不能在 Windows 上正常工作)。 要檢查文件是否與當前目錄中的模式匹配,您可以使用 glob.glob() 函數。

 In [1]: import glob In [2]: glob.glob('testfile.txt') Out[2]: ['testfile.txt'] In [3]: glob.glob('testdirectory') Out[3]: ['testdirectory']

在上面的代碼中,傳遞給 glob 函數的模式是一個普通字符串,表示測試文件和目錄的路徑。 由於兩個路徑都存在,該函數返回一個列表,其中包含匹配的路徑名。

注意:如果模式不匹配,您將得到一個空列表。

考慮到我們可以將模式傳遞給 glob 函數,為什麼不測試它的一些主要優點呢?

下面的代碼分別獲取擴展名為.txt.py 的所有文件路徑:

 In [4]: glob.glob('*.txt') Out[4]: ['testfile.txt'] In [5]: glob.glob('*.py') Out[5]: ['pathlib-exists.py', 'list-dir.py', 'glob-file.py', 'open-except.py', 'subprocess-test.py', 'isfile.py', 'exists.py', 'isdir.py']

使用路徑類

Path 類是處理路徑的最佳方法之一,因為它為我們提供了一個乾淨的界面來將文件路徑作為對象進行處理。

蛋糕的櫻桃是 Path 實例具有獲取有關特定路徑的信息所需的所有方法。 這包括與先前選項類似的功能。

注意:您需要 Python 3.4 或更高版本才能使用 pathlib 庫

您將使用的 Path 方法:

  • 路徑()。存在()
  • 路徑().is_file()
  • 路徑().is_dir()

檢查路徑是否存在

In [1]: from pathlib import Path In [2]: Path('testfile.txt').exists() Out[2]: True In [3]: Path('im-not-here.txt').exists() Out[3]: False In [4]: Path('testdirectory').exists() Out[4]: True

os.path.exists() 的工作原理相同。

檢查路徑是否指向文件

In [5]: Path('testfile.txt').is_file() Out[5]: True In [6]: Path('testdirectory').is_file() Out[6]: False

相當於os.path.isfile()

檢查路徑是否指向目錄

In [7]: Path('testfile.txt').is_dir() Out[7]: False In [8]: Path('testdirectory').is_dir() Out[8]: True

對應於os.path.isdir()。

子流程

如果您是子流程模塊愛好者,則需要了解此選項。 您可以使用 test 命令確定文件或文件夾是否存在。

注意: test命令僅在 Unix 中有效。

以下測試標誌將完成工作:

  • test -e:檢查路徑是否存在
  • test -f:檢查文件是否存在
  • test-d:檢查文件夾是否存在

如果您想深入了解更多測試標誌,可以通過運行以下命令閱讀手冊:

 man test

使用子進程檢查路徑:

下面的代碼通過將子進程的返回碼與 0 進行比較來確定路徑是否存在。

請記住,在 Linux 中,如果進程運行良好,它將返回零,否則將返回任何其他代碼。

 In [1]: from subprocess import run In [2]: run(['test', '-e', 'testfile.txt']).returncode == 0 Out[2]: True In [3]: run(['test', '-e', 'im-not-here.txt']).returncode == 0 Out[3]: False

在第一條語句中,我們導入 subprocess 模塊,然後使用 run 函數並獲取其返回碼。

使用子進程驗證文件的存在

In [4]: run(['test', '-f', 'testfile.txt']).returncode == 0 Out[4]: True In [5]: run(['test', '-f', 'testdirectory']).returncode == 0 Out[5]: False

使用子進程檢查目錄:

 In [6]: run(['test', '-d', 'testfile.txt']).returncode == 0 Out[6]: False In [7]: run(['test', '-d', 'testdirectory']).returncode == 0 Out[7]: True

不建議使用此選項,因為它會消耗更多資源,而且我們不會從中獲得任何優勢。

總結

Python 是最常用的編程語言之一,通過與操作系統交互來自動化流程。 您可以用它做的一件很酷的事情是檢查文件或文件夾是否存在。

最直接的做法是:

  • 立即打開和處理文件異常
  • 使用os.pathpathlib模塊的exists()函數。

在本教程中,您學習了:

  • 如果文件不存在,如何打開文件並處理異常
  • 路徑的含義
  • os.path子模塊提供了 3 個不同的函數來檢查文件或文件夾的存在
  • Unix 使用正斜杠 (/),而 Windows 使用反斜杠 (\)

下一篇:Python 中的子進程是什麼? [5 用法示例]