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