python学习之计算目录的磁盘使用率

使用os.statvfs实现

Posted by YangSijie on June 11, 2018

通过os.statvfs计算某目录的使用率等

基础知识

通过使用os.statvfs()可以计算出指定目录的使用情况,下面将其与Linux下的df命令做一个对比

先看一下os.statvfs调用后的输出结果:

>>> import os
>>> os.statvfs('/')
posix.statvfs_result(f_bsize=4096, f_frsize=4096, f_blocks=25403486, f_bfree=17181744, f_bavail=15885552, f_files=6463488, f_ffree=6056870, f_favail=6056870, f_flag=4096, f_namemax=255)

下面将对输出的这些字段做解释:

字段值 字段含义
f_bsize 文件系统快大小
f_frsize 分栈大小
f_blocks 文件系统数据块总数
f_bfree 可用块数
f_bavail 非超级用户可获取的块数
f_files 文件节点总数
f_ffree 可用文件节点数
f_favail 非超级用户可用文件节点数
f_flag 挂载标记
f_namemax 最大文件长度

在有了这些数据的情况下,就可以进一步计算出当前目录下的硬盘占用情况等

计算方法如下(中括号内表示的是对应于df输出中的哪一列):

  • 总容量(KB) = f_bsize * f_blocks / 1024 【1k-blocks】
  • 使用量(KB) = f_bsize * (f_blocks - f_bfree) / 1024 【Used】
  • 有效容量(KB) = f_bsize * f_bavail / 1024 【Available】
  • 使用量(%) = 使用量 / (使用量+有效容量) * 100 【Use%】

案例

使用df查看根目录的磁盘使用情况:

df
文件系统           1K-块       已用      可用  已用% 挂载点
udev             3917616        0  3917616    0% /dev
tmpfs             788828     9724   779104    2% /run
/dev/sda8      101613944 32908924 63520252   35% /
tmpfs            3944128   107660  3836468    3% /dev/shm
tmpfs               5120        4     5116    1% /run/lock
tmpfs            3944128        0  3944128    0% /sys/fs/cgroup
/dev/loop0         89088    89088        0  100% /snap/core/4917
/dev/loop3        296064   296064        0  100% /snap/pycharm-professional/78
/dev/loop2         89088    89088        0  100% /snap/core/5145
/dev/loop1        301184   301184        0  100% /snap/pycharm-professional/80
/dev/sda7         463724   132903   302360   31% /boot
cgmfs                100        0      100    0% /run/cgmanager/fs
tmpfs             788828       88   788740    1% /run/user/1000
unionfs-fuse   101613944 32908924 63520252   35% /home/yangsijie/.QQ.unionfs
unionfs-fuse   101613944 32908924 63520252   35% /home/yangsijie/.TIM.unionfs

使用os.statvfs分析根目录的磁盘使用情况:

import os

def disk_info(path):
	vfs = os.statvfs(path)
	total = vfs.f_bsize * vfs.f_blocks / 1024
	used = vfs.f_bsize * (vfs.f_blocks - vfs.f_bfree) / 1024
	avail = vfs.f_bsize * vfs.f_bavail / 1024
	used_percent = round(float(used) / float(used + avail) * 100, 2)
	print ('总容量为: %d' % total)
	print ('使用量为: %d' % used)
	print ('有效容量为: %d' % avail)
	print ('使用率为: %f' % used_percent)
    

disk_info('/')

执行结果为:

总容量为: 101613944
使用量为: 32909872
有效容量为: 63519304
使用率为: 34.130000

从结果中可以看出,与df中的指定字段的内容是基本一致的,没有太大的出入

如果想要查看一个目录的使用情况呢?比如说/var/lib/docker

disk_info('/var/lib/docker')

执行结果为:

总容量为: 101613944
使用量为: 32910220
有效容量为: 63518956
使用率为: 34.130000

会发现与之前的/目录情况一致,为什么会有这种情况?

其实细细看一下df的输出就可以发现,/var/lib/docker目录下并没有单独挂载一个分区,也就是说//var/lib/docker是共享分区的,所以他们显示的磁盘信息是相同的