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

