如何使用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

更新於:2023年2月24日

7K+ 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.