如何使用Python計算目錄大小?
目錄簡單來說就是子目錄和單個檔案的集合;或者兩者之一。在目錄層次結構中,這些子目錄用“/”運算子分隔。
目錄層次結構是透過在一個主目錄(也稱為“根”目錄)中組織所有檔案和子目錄來構建的。當要計算目錄大小時,我們將它視為根目錄,並計算其中所有檔案和子目錄(如有)的單個大小。
因此,要獲取目錄的大小,我們必須遍歷層次結構以獲取其中所有檔案的大小。Python 提供了幾種方法來實現這一點。
使用 os.path.getsize() 方法
使用 os.stat().st_size 屬性
在 *NIX 作業系統中使用 du 命令
讓我們在本文中詳細討論所有這些方法。
使用 os.path.getsize() 方法
os.path.getsize() 方法用於檢索目錄中單個檔案的大小。要獲取總目錄大小,我們可以將其中所有檔案的大小加起來。但是,要遍歷此目錄中的所有檔案,除了此方法之外,我們還使用 os.walk() 方法。
此方法接受檔案路徑作為引數,並以位元組 (bytes) 為單位返回檔案的大小。
示例
讓我們來看一個計算本地目錄大小的示例。在這裡,我們使用迴圈語句,藉助 os.walk() 方法遍歷目錄層次結構。然後,使用 os.path.join() 方法檢索此目錄中每個檔案的路徑,然後將其作為引數傳遞給 os.path.getsize() 方法。然後將所有檔案的大小相加並顯示。
import os
total_size = 0
start_path = '.' # To get size of current directory
for path, dirs, files in os.walk(start_path):
for f in files:
fp = os.path.join(path, f)
total_size += os.path.getsize(fp)
print("Directory size: " + str(total_size))
輸出
如果我們執行上面的程式,則會產生如下輸出。必須記住,不同目錄的輸出會有所不同。
Directory size: 260
除了 os.walk() 方法之外,我們還可以使用 os.scandir() 方法或 os.listdir() 方法來列出檔案並檢索它們的大小。
讓我們看看下面的例子:
示例
在這個例子中,我們使用 scandir() 方法掃描當前目錄並遞迴地獲取其中所有檔案的大小。將大小相加以檢索目錄的總大小。
import os
total_size = 0
start_path = '.' # To get size of current directory
with os.scandir(start_path) as d:
for f in d:
if f.is_file():
fp = os.path.join(start_path, f)
total_size += os.path.getsize(fp)
print("Directory size: " + str(total_size))
輸出
上面程式的輸出如下:
Directory size: 278
示例
在這裡,讓我們使用 os.listdir() 方法代替 os.scandir() 方法。
import os
total_size = 0
start_path = '.' # To get size of current directory
for f in os.listdir(start_path):
f = os.path.join(start_path, f)
total_size += os.path.getsize(f)
print("Directory size: " + str(total_size))
輸出
讓我們編譯並執行上面的程式,以產生如下輸出:
Directory size: 226
使用 os.stat().st_size 屬性
檢索檔案大小的另一種方法是使用 os.stat().st_size 屬性。os.stat() 方法用於獲取大小(以位元組為單位)或其他與檔案相關的資訊。由於我們只需要檔案大小資訊,因此我們只使用 st_size 屬性。
示例
在下面的示例中,我們匯入 pathlib 模組,並使用 glob() 方法列出當前目錄中存在的所有檔案。然後,如果目錄中存在檔案,則使用 os.stat().st_size 屬性遞迴計算它們的大小。
from pathlib import Path
root_directory = Path('.')
size = 0
for f in root_directory.glob("*"):
if f.is_file():
sm = f.stat().st_size
size = sm + size
print("Size of current directory:", size)
輸出
如果我們執行上面的程式,則會產生如下結果:
Size of current directory: 209
示例
我們還可以使用 os.scandir() 方法列出目錄中的所有檔案,而不是 glob() 方法。演示此方法的示例如下。
import os
def get_dir_size(path):
total = 0
with os.scandir(path) as d:
for f in d:
if f.is_file():
total += f.stat().st_size
elif f.is_dir():
total += get_dir_size(f.path)
return total
print("The size of current directory", get_dir_size('.'))
輸出
上面給定程式的輸出顯示如下:
The size of current directory 303
在 *NIX 作業系統中
如果您使用的是 *NIX 作業系統,則可以簡單地使用 subprocess 模組呼叫 du 命令,因為它比上述方法簡單得多。
示例
可以在下面的示例中簡單地計算 *NIX 作業系統中當前目錄的大小。
import subprocess
path = '.'
size = subprocess.check_output(['du','-sh', path]).split()[0].decode('utf-8')
print("Directory size: " + size)
輸出
當前目錄的大小將按如下方式返回。但是,不同目錄的輸出會有所不同。
Directory size: 8.0K
資料結構
網路
關係資料庫管理系統(RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP