如何在 Python 中檢查文件和文件夾大小?
已發表: 2021-06-16在本文中,您將學習在 Python 中檢查文件或文件夾的大小
Python 是最通用的編程語言之一。 有了它,您將能夠從小型 CLI(命令行界面)程序構建到復雜的 Web 應用程序。
然而,其最被低估的功能之一是與操作系統交互的能力。 在創建自動化流程時,使用 Python 管理操作系統操作可以為您節省大量時間。
讓我們看看 Python 如何與操作系統交互。
Python 如何與操作系統交互?

沒有人可以脫離他們的環境而生活。 這也適用於 Python,在 Python 中,有時與操作系統交互以完成工作至關重要。
Python 有幾個模塊可以讓我們與操作系統交互。 最常用的是os、sys、pathlib和subprocess。
由於它們是內置模塊,因此您無需使用 PIP 安裝它們。 您可以使用以下語句導入所有這些:
import os import sys import pathlib import subprocess下面的列表顯示了這些導入中的每一個的主要功能:
- Os:使用系統特定(取決於您的操作系統)功能的便攜式方式。 在大多數情況下這是正確的選擇,除非您需要更高級的東西
- Sys:系統特定的參數和功能。 該模塊提供對解釋器變量和函數的訪問。 os 模塊與操作系統交互,sys 與 Python 解釋器交互
- Pathlib:高級路徑用法。 允許您將文件系統表示為對象,並具有每個操作系統的相關語義。
- 子進程:直接從 Python 執行和子進程管理。 這涉及使用
stdin、stdout和返回代碼。 您可以通過閱讀我們的 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 du或du –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命令計算目錄的大小
