如何使用Python计算目录大小

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

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程