如何使用 Python 计算目录大小?


目录简单来说就是子目录和单个文件的集合;或者其中之一。在目录层次结构中,这些子目录使用“/”运算符分隔。

目录层次结构是通过将所有文件和子目录组织在一个主目录(也称为“根”目录)中来构建的。当要计算目录的大小时,我们将将其视为根目录,并计算其中所有文件和子目录(如果有)的单个大小。

因此,要获取目录的大小,我们必须遍历层次结构以获取其中所有文件的大小。Python 提供了几种方法来做到这一点。

  • 使用 os.path.getsize() 方法

  • 使用 os.stat().st_size 属性

  • 在 *NIX 操作系统中使用 du 命令

让我们在本文中进一步详细讨论所有这些方法。

使用 os.path.getsize() 方法

os.path.getsize() 方法用于检索目录中单个文件的大小。要获取总目录大小,我们可以将其中所有文件的大小加起来。但是,要遍历此目录中的所有文件,除了此方法之外,我们还使用 os.walk() 方法。

此方法接受文件路径作为其参数,并以字节 ( ) 为单位返回文件的大小。

示例

让我们看一个计算本地目录大小的示例。在这里,我们使用循环语句在 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+ 浏览量

启动您的 职业生涯

通过完成课程获得认证

开始
广告