程序员文章、书籍推荐和程序员创业信息与资源分享平台

网站首页 > 技术文章 正文

一段获取磁盘空间信息的python脚本

hfteth 2025-01-11 13:30:44 技术文章 14 ℃

简介

这是一个获取Linux下的磁盘空间信息的脚本,通过Linux下的df命令获取到全部的磁盘空间的使用情况,然后在去掉临时空间等行的信息,只保留物理硬盘的信息。信息包括分区的文件系统类型、空间大小、已用大小、可用大小、已用百分比、挂载点。整体有效代码连同注释共39行,除去主入口、注释行和空白行,实际有效代码仅20行而已。有兴趣体验这个脚本的朋友可以直接创建一个.py文件,然后把完整代码直接复制过去,保存后运行即可。下面是运行的结果截图。

完整的代码

import os
import prettytable

def diskInfo():
    # 直接使用shell命令的df加参数hT获取磁盘分区的信息和文件系统格式
    # 使用grep的vE过滤掉tmpfs的分区和docker的挂载卷overlay,这样得到的才是物理硬盘的分区信息
    disk_list = os.popen('df -hT|grep -vE "(tmpfs|overlay)"').readlines()

    # 初始化第三方库prettytable,用于将数据在输出是美化为表格
    table = prettytable.PrettyTable()

    # 拆分数据,用于prettytable的表头,直接复制list就可以。
    title = disk_list[0].split(' ')
    new_title = []
    for item in title:
        # 按照上面用空格拆分,存在有空值的元素,需要抛弃
        if item == '':
            continue

        new_title.append(item.replace('\n', ''))
    # 添加表格的表头
    table.field_names = new_title

    # 拆分数据,用于表的内容,有多少条数据就循环几次
    for item in disk_list[1:]:
        new_item = []
        for item2 in item.split(' '):
            # 按照上面用空格拆分,存在有空值的元素,需要抛弃
            if item2 == '':
                continue

            new_item.append(item2.replace('\n', ''))
        # 添加数据到表格中
        table.add_row(new_item)

    print(table)

if __name__ == '__main__':
    diskInfo()

代码解析

第1~2行代码

import os
import prettytable

这个脚本的使用到的库很少,只有两个,内置的os库和第三方的prettytable。prettytable需要安装才可以使用,否则脚本会报错。安装的命令pip install prettytable

第38~39行代码

if __name__ == '__main__':
    systemInfo()

可以理解为运行这个文件时的主入口,在python中,文件独立运行时,它的魔法函数 __name__ 会返回 __main__ 而在该文件被其他文件引用调用的时候,则不是返回 __main__ 。这个入口的意思就是,运行这个脚本文件的时候,就执行 systemInfo() 函数。函数在上面的第5~28行中已经定义了。

第7行代码

disk_list = os.popen('df -hT|grep -vE "(tmpfs|overlay)"').readlines()

代码里面的注释也已经解释得很清楚了,利用os库的popen()函数,直接在命令行里面执行df命令查看并且过滤掉临时文件系统(tmpfs)和docker的文件系统(overlay),然后赋值给变量名disk_list,为什么变量名有list,因为readlines()函数返回的就是一个list类型。df -hT命令后面的两个参数h是df命令输出的结果为符合人类阅读的格式,如xxxM、xxxG这样有M、G、T等计数单位的信息。比较方便阅读。grep -vE "(tmpfs|overlay)"'参数v是表示这个过滤的结果为不显示的,E "(tmpfs|overlay)"参数是用正则搜索包含tmpfs或者overlay的行。包含着两个的行,都是不需要的,配合前面的参数v,就可以把包含这两种情况的行隐藏不显示。符合咱们只需要物理磁盘信息的需求。

第7行代码

    table = prettytable.PrettyTable()

初始化一个表格并赋值给变量名table,这个表格用于美化后面的输出。

第13~22行代码

    title = disk_list[0].split(' ')
    new_title = []
    for item in title:
        if item == '':
            continue

        new_title.append(item.replace('\n', ''))
    table.field_names = new_title

这几行代码,主要的作用是把上面提及的df命令中获取到的信息取出来第一个元素里面的信息,这些信息是表头的内容,取出后需要用空格分割,在去掉内用的空格内容,还有去掉换行符,组成一个新的list,再将这个list赋值给表格的表头。

第25~34行代码

    for item in disk_list[1:]:
        new_item = []
        for item2 in item.split(' '):
            if item2 == '':
                continue
            new_item.append(item2.replace('\n', ''))
        table.add_row(new_item)

和上面组合表头的代码类似,不过这行做的处理是处理第二个元素及以后的元素,一个元素为一行,同样是去空白和去换行符的处理,然后一个元素的内容处理为一个list,添加为表格的一行。

第36行代码

print(table)

将上面组合并美化为表格的内容输出到命令行。也就是最开始图片里面那样的输出结果。




如果您对我的文章有兴趣,我把我发布的文章都归档到我私人网站中去,欢迎访问 Corner 三的小角落 -- 首页 查阅之前的文章。

最近发表
标签列表