如何在 Python 中檢查文件和文件夾大小?

已發表: 2021-06-16

在本文中,您將學習在 Python 中檢查文件或文件夾的大小

Python 是最通用的編程語言之一。 有了它,您將能夠從小型 CLI(命令行界面)程序構建到復雜的 Web 應用程序。

然而,其最被低估的功能之一是與操作系統交互的能力。 在創建自動化流程時,使用 Python 管理操作系統操作可以為您節省大量時間。

讓我們看看 Python 如何與操作系統交互。

Python 如何與操作系統交互?

Python 通過 os、sys、path 和 subprocess 模塊與 Os 交互

沒有人可以脫離他們的環境而生活。 這也適用於 Python,在 Python 中,有時與操作系統交互以完成工作至關重要。

Python 有幾個模塊可以讓我們與操作系統交互。 最常用的是os、sys、pathlib和subprocess。

由於它們是內置模塊,因此您無需使用 PIP 安裝它們。 您可以使用以下語句導入所有這些:

 import os import sys import pathlib import subprocess

下面的列表顯示了這些導入中的每一個的主要功能:

  • Os:使用系統特定(取決於您的操作系統)功能的便攜式方式。 在大多數情況下這是正確的選擇,除非您需要更高級的東西
  • Sys:系統特定的參數和功能。 該模塊提供對解釋器變量和函數的訪問。 os 模塊與操作系統交互,sys 與 Python 解釋器交互
  • Pathlib:高級路徑用法。 允許您將文件系統表示為對象,並具有每個操作系統的相關語義。
  • 子進程:直接從 Python 執行和子進程管理。 這涉及使用stdinstdout和返回代碼。 您可以通過閱讀我們的 Python 子流程指南了解更多信息。

根據您的需要,有一些高級庫包含更具體的功能。 但是,大多數情況下,您可以使用上述模塊。

注意:這些模塊提供的大多數功能將根據您的操作系統具有不同的輸出。 請記住,通常情況下,最佳匹配是 UNIX 和 Python。

現在您已經快速掌握了 Python 如何與操作系統交互,讓我們進入檢查文件和文件夾大小的方法。 Python GitHub 存儲庫中的文件和文件夾大小中提供了以下所有解決方案

使用 os.stat().st_size

在這個方法中,我們將使用 os 模塊中的 stat() 函數。 它返回有關特定路徑的大量信息。

注意: os.path.getsize()函數也可以完成工作。 使用os.stat()的優勢 st_size是它不遵循 simlinks。

在繼續之前,讓我們創建一個名為lorem.txt的測試文件,我們將在其中粘貼一些愚蠢的文本。 我們可以訪問 Lorem Ipsum 文本生成器並將文本粘貼到lorem.txt文件中。

在同一目錄中,創建一個名為method1.py的文件並粘貼以下代碼:

 import os size = os.stat('lorem.txt').st_size print(size)

讓我們分解一下我們正在用這段代碼做什麼:

  • 在第一行,我們導入os模塊
  • size變量包含文件lorem.txt的大小
    • os.stat()函數返回一堆與文件相關的信息
    • st_size屬性表示文件的大小
  • 我們打印大小變量

嘗試運行 Python 腳本。 根據lorem.txt文件的內容,您將獲得不同的結果。

輸出:

 20064

輸出以字節表示。 這根本不可讀,所以讓我們對其進行人性化,以便我們可以更好地了解文件的大小。

首先,通過在 shell 中運行以下命令來安裝 humanize 包:

 pip install humanize

然後,您可以使用naturalsize()函數將字節值轉換為可讀文件大小,例如 KB、MB、GB 或 TB。

 import os from humanize import naturalsize size = os.stat('lorem.txt').st_size print(size) print(naturalsize(size))

首先,上面的代碼以字節為單位打印文件的大小,然後以可讀的大小打印結果。

輸出:

 20064 20.1 kB

使用路徑庫

儘管 pathlib 被設計為專門處理路徑,但它結合了其他模塊的一些有用函數作為 Path 對象的方法(Path 類的實例)。

創建文件method2.py並導入 Path 類。

 from pathlib import Path

然後創建一個 Path 對象,將lorem.txt文件的路徑作為參數傳遞。

 file_ = Path('lorem.txt')

現在,您可以訪問 Path 類的stat()方法。 它的工作原理與os.stat()函數相同,因此您將能夠打印文件的大小。

 print(file_.stat().st_size)

輸出:

 20064

如您所見,我們得到了與我們使用的第一種方法相同的結果。 上面的結果也是以字節格式打印的,所以我們可以使用humanize模塊讓它可讀。

 from pathlib import Path from humanize import naturalsize size = Path('lorem.txt').stat().st_size print(naturalsize(size))

此代碼產生以下輸出:

 20.1 kB

在子進程中使用 Unix 命令:

subprocess 模塊,允許我們從 Python 調用和管理子進程。 因此,我們可以運行任何命令並直接在 Python 中處理其輸出。

注意:此方法僅適用於運行 Unix 操作系統(Linux、Mac)

打開文件method3.py並粘貼以下代碼:

 from subprocess import run process = run(['du', 'lorem.txt'], capture_output=True, text=True) print(process.stdout)

深入研究這段代碼:

  • 我們從 subprocess 模塊導入 run 函數
  • 變量 process 包含運行命令du lorem.txt 的結果
    • du是一個 Linux 實用程序,它允許我們獲取文件的磁盤空間
    • capture_output使我們可以訪問突出(標準輸出)屬性
    • text意味著我們將輸出存儲為字符串而不是字節
  • 我們打印流程的標準輸出

如果您運行上面的代碼,您將獲得以下輸出:

 20 lorem.txt

如您所見,它為我們提供了文件的大小和名稱。 如果您只想獲取文件的大小,則需要拆分輸出(記住它是一個字符串)並打印第一個元素。

 from subprocess import run process = run(['du', 'lorem.txt'], capture_output=True, text=True) size = process.stdout.split()[0] print(size)

輸出:

 20

此輸出根本不可讀。 我們可以推斷出使用的度量單位是KB(因為之前的方法),但沒有其他人可以猜測文件的大小。

為了解決這個問題,我們可以使用-h (人類可讀)標誌。

注意:您可以通過運行man dudu –help來獲取此命令的手冊。

 from subprocess import run process = run(['du', '-h', 'lorem.txt'], capture_output=True, text=True) size = process.stdout.split()[0] print(size)

現在這個腳本的輸出將更具可讀性:

 20K

如果您想了解有關子流程模塊和可能的應用程序的更多信息,請查看我們的 Python 子流程指南。

遞歸獲取文件夾的大小

如果要獲取文件夾的大小,則需要遍歷目錄及其子目錄中存在的每個文件。 我們將使用兩種方法來做到這一點:

  • 使用 pathlib 迭代路徑
  • 將 du 命令與子進程一起使用

以下代碼將使用我的主文件夾中測試目錄的路徑。 您需要為要獲取大小的目錄替換該文件的路徑。

使用 pathlib 迭代路徑

讓我們看看如何通過迭代文件的大小來獲取目錄的大小。

 from pathlib import Path from humanize import naturalsize def get_size(path = '.'): size = 0 for file_ in Path(path).rglob('*'): size += file_.stat().st_size return naturalsize(size) test_path = Path.home() / 'Documents/tests/' print(get_size(test_path))

這段代碼看起來有點嚇人,讓我們分解一下每個部分在做什麼。

  • 導入Path類和naturalsize()函數
  • 使用參數path定義get_size()函數,該參數默認指向當前目錄。
  • size 變量只是一個佔位符,我們將在其中添加每個文件的大小
  • 遍歷路徑的每個文件
    • rglob()方法遞歸返回匹配模式的文件
    • rglob('*') ,意味著我們正在獲取目錄中的所有文件
  • 獲取每個文件的大小並將其添加到大小變量
  • 以人類可讀的方式返回大小變量

當然,我正在使用僅在我的機器中可用的目錄來測試該功能。 不要忘記更改計算機上存在的文件夾的路徑。

就我而言,我得到以下輸出:

 403.4 MB

在子進程中使用 du 命令

這種方法有一些優點:

  • 結果更準確一點
  • 它要快得多
from subprocess import run from pathlib import Path test_path = Path.home() / 'Documents/tests/' process = run(['du', '-sh', test_path], capture_output=True, text=True) size = process.stdout.split()[0] print(size)

我們使用與方法 3 相同的方法,但這次我們獲取的是目錄而不是文件的大小。

輸出:

 481M

正如您所看到的,這兩種獲取文件夾大小的方法返回的結果略有不同。 目錄越大,您獲得的差異就越大。

這是給你的pathlib方法之間做出選擇。 如果你知道你會使用Linux每次使用的子進程,否則你可以使用pathlib解決方案。

總結

Python 在與操作系統交互時非常方便。 您可以使用 Python 自動化流程並節省大量時間。 與 os 交互的主要模塊是 os、sys、path 和 subprocess。

在本教程中,您學習了:

  • Python 如何與操作系統交互
  • 使用內置模塊進行OS操作
  • 如何使用humanize模塊打印人類可讀的
  • 用 3 種方法計算文件的大小
  • 以遞歸方式或使用du命令計算目錄的大小