如何使用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+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告