You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用shutil.disk_usage获取目录大小?为何结果不一致?

关于shutil.disk_usage的误解与目录大小获取方法

我使用Python 3.10.4版本,在Windows 11系统的Visual Studio Code中通过Jupyter Notebook调用shutil包的disk_usage函数。根据Python官方文档说明:

shutil.disk_usage(path)
返回指定路径的磁盘使用统计信息,形式为一个包含total、used、free属性的命名元组,分别对应总空间、已用空间、可用空间,单位为字节。path可以是文件或目录。
Python 3.3版本新增。
Python 3.8版本变更:在Windows系统中,path现在可以是文件或目录。

但以下三个代码片段的输出结果本应一致却不相同,请问如何使用该函数获取目录的大小?

示例1

from shutil import disk_usage
import os
print(disk_usage("C:/Users"))
print(disk_usage("C:"))

输出:

usage(total=999424712704, used=624119431168, free=375305281536)
usage(total=999424712704, used=624119435264, free=375305277440)

示例2

from shutil import disk_usage
import os
print(disk_usage("C:"))
print(disk_usage(r"C:\Users"))

输出:

usage(total=999424712704, used=624119824384, free=375304888320)
usage(total=999424712704, used=624119824384, free=375304888320)

示例3

调用顺序不同结果有差异

from shutil import disk_usage
import os
print(disk_usage(r"C:\Users"))
print(disk_usage("C:"))

输出:

usage(total=999424712704, used=624120086528, free=375304626176)
usage(total=999424712704, used=624120090624, free=375304622080)


问题原因说明

首先要明确:shutil.disk_usage并不是用来获取目录大小的工具,它返回的是目标路径所在整个磁盘分区的使用统计数据。

你看到的数值差异,本质是两次调用函数的时间差里,磁盘在实时写入数据(比如系统日志、临时文件、Jupyter缓存等),导致分区的已用/可用空间发生了细微变化。而C:和C:\Users指向的都是同一个C盘分区,所以total值始终一致,只是used和free会随时间波动。

获取目录大小的正确方法

如果需要获取某个目录的实际占用空间,需要自己实现递归遍历目录、累加所有文件大小的逻辑,示例代码如下:

import os

def calculate_dir_size(dir_path):
    total_size = 0
    # 遍历目录下的所有文件和子目录
    for root, _, files in os.walk(dir_path):
        for file in files:
            file_path = os.path.join(root, file)
            # 跳过符号链接,避免统计错误
            if not os.path.islink(file_path):
                try:
                    # 累加单个文件的大小
                    total_size += os.path.getsize(file_path)
                except OSError:
                    # 处理无法访问的文件(如权限限制)
                    pass
    return total_size

# 调用示例:计算C:\Users目录的大小
dir_size_bytes = calculate_dir_size(r"C:\Users")
# 转换为更易读的GB单位
dir_size_gb = dir_size_bytes / (1024 ** 3)
print(f"目录总大小:{dir_size_gb:.2f} GB")

这个函数会遍历目标目录下的所有文件(包括子目录中的文件),累加每个文件的字节数,最终返回目录的总占用空间。如果遇到权限不足无法访问的文件,会自动跳过避免报错。

内容的提问来源于stack exchange,提问作者Nivatius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:50:16