2017.7.21 python statvfs方法读取磁盘容量
实地代码
[maintenance@localhost ~]$ python
Python 2.7.5 (default, Nov 6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import statvfs
>>> vfs = os.statvfs("/home")
>>> vfs
posix.statvfs_result(f_bsize=4096, f_frsize=4096, f_blocks=521728, f_bfree=144359, f_bavail=144359, f_files=1048576, f_ffree=1005229, f_favail=1005229, f_flag=4096, f_namemax=255)
>>> dir(statvfs)
['F_BAVAIL', 'F_BFREE', 'F_BLOCKS', 'F_BSIZE', 'F_FAVAIL', 'F_FFREE', 'F_FILES', 'F_FLAG', 'F_FRSIZE', 'F_NAMEMAX', '__builtins__', '__doc__', '__file__', '__name__', '__package__']
>>> available=vfs[statvfs.F_BAVAIL]*vfs[statvfs.F_BSIZE]/(1024*1024*1024)
>>> available
0
>>> available=vfs[statvfs.F_BAVAIL]*vfs[statvfs.F_BSIZE]/(1024*1024)
>>> available
563
>>> capacity=vfs[statvfs.F_BLOCKS]*vfs[statvfs.F_BSIZE]/(1024*1024)
>>> capacity
2038
>>> used=capacity-available
>>> used
1475
参数
path -- 文件路径。
返回值
返回的结构:
f_bsize: 文件系统块大小
f_frsize: 分栈大小
f_blocks: 文件系统数据块总数
f_bfree: 可用块数
f_bavail:非超级用户可获取的块数
f_files: 文件结点总数
f_ffree: 可用文件结点数
f_favail: 非超级用户的可用文件结点数
f_fsid: 文件系统标识 ID
f_flag: 挂载标记
f_namemax: 最大文件长度
statvfs的数据结构,成员信息
struct statvfs {
unsigned long f_bsize; /* file system block size */
unsigned long f_frsize; /* fragment size */
fsblkcnt_t f_blocks; /* size of fs in f_frsize units */
fsblkcnt_t f_bfree; /* # free blocks */
fsblkcnt_t f_bavail; /* # free blocks for non-root */
fsfilcnt_t f_files; /* # inodes */
fsfilcnt_t f_ffree; /* # free inodes */
fsfilcnt_t f_favail; /* # free inodes for non-root */
unsigned long f_fsid; /* file system ID */
unsigned long f_flag; /* mount flags */
unsigned long f_namemax; /* maximum filename length */
};
使用statvfs读取文件系统信息
///文件操作偏移地址启用64位形式
#define _FILE_OFFSET_BITS 64
#include <stdio.h>
#include <sys/statvfs.h>
typedef enum {
TOTAL_SIZE,///文件系统的大小
FREE_SIZE, ///自由空间
USED_SIZE, ///已用空间
AVAIL_SIZE ///用户实际可以使用的空间
}VFsize;
//把数字大小转换成字符形式
char *
byte_size_to_string(fsblkcnt_t size)
{
const double k = 1024;
const double m = k*1024;
const double g = m*k;
static char size_str[128] = {0};
if(size>=g)
sprintf(size_str,"%0.2lf GB",size/g);
else if(size>=m)
sprintf(size_str,"%0.2lf MB",size/m);
else if(size>=k)
sprintf(size_str,"%0.2lf KB",size/k);
else
sprintf(size_str,"%0.0lf Byte",size>=0?size:0.0);
return size_str;
}
///文件系统的各种信息数据的大小
fsblkcnt_t
get_vfs_size(struct statvfs *buf,VFsize flag)
{
fsblkcnt_t block;
fsblkcnt_t bsize;
bsize = buf->f_bsize;
switch (flag){
case TOTAL_SIZE:
block = buf->f_blocks;
break;
case FREE_SIZE:
block = buf->f_bfree;
break;
case USED_SIZE:
block = buf->f_blocks - buf->f_bavail;
break;
case AVAIL_SIZE:
block = buf->f_bavail;
break;
default:
block = 0;
break;
}
return bsize * block;
}
int main(int argc, char **argv)
{
char *pathname;
struct statvfs buf;
fsblkcnt_t total_size;
fsblkcnt_t used_size;
fsblkcnt_t avail_size;
int error;
pathname = "/";
if(argc>1){
pathname = argv[1];
}
//把文件系统信息读入 struct statvfs buf 中
error = statvfs(pathname,&buf);
//错误检查
if(error <0){
fprintf(stderr,"statvfs():%m\n");
return error;
}
//输出结果,此结果与gparted一致,与df出入较大
printf("FileSystem of \'%s\':\n",pathname);
total_size = get_vfs_size(&buf,TOTAL_SIZE);
printf(" total:%s\n",byte_size_to_string(total_size));
used_size = get_vfs_size(&buf,USED_SIZE);
printf(" used :%s\n",byte_size_to_string(used_size));
avail_size = get_vfs_size(&buf,AVAIL_SIZE);
printf(" Avail:%s\n",byte_size_to_string(avail_size));
return 0;
}
2017.7.21 python statvfs方法读取磁盘容量的更多相关文章
- 深入学习python解析并读取PDF文件内容的方法
这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...
- python linecache模块读取文件的方法
转自: python linecache模块读取文件 在Python中,有个好用的模块linecache,该模块允许从任何文件里得到任何的行,并且使用缓存进行优化,常见的情况是从单个文件读取多行. l ...
- Python os.statvfs() 方法
概述 os.statvfs() 方法用于返回包含文件描述符fd的文件的文件系统的信息.高佣联盟 www.cgewang.com 语法 statvfs()方法语法格式如下: os.statvfs([pa ...
- 重拾Python(5):数据读取
本文主要对Python如何读取数据进行总结梳理,涵盖从文本文件,尤其是excel文件(用于离线数据探索分析),以及结构化数据库(以Mysql为例)中读取数据等内容. 约定: import numpy ...
- Python str方法总结
1.返回第一个字母大写 S.capitalize(...) S.capitalize() -> string 1 2 3 4 >>>a = 'shaw' >>> ...
- python中逐行读取文件的最佳方式_Drupal_新浪博客
python中逐行读取文件的最佳方式_Drupal_新浪博客 python中逐行读取文件的最佳方式 (2010-08-18 15:59:28) 转载▼ 标签: python ...
- 二十一. Python基础(21)--Python基础(21)
二十一. Python基础(21)--Python基础(21) 1 ● 类的命名空间 #对于类的静态属性: #类.属性: 调用的就是类中的属性 #对象.属性: 先从自己的内存空间里找名 ...
- python使用xlrd读取excel数据时,整数变小数的解决办法
python使用xlrd读取excel数据时,整数变小数: 解决方法: 1.有个比较简单的就是在数字和日期的单元格内容前加上一个英文的逗号即可.如果数据比较多,也可以批量加英文逗号的前缀(网上都有方法 ...
- Python String 方法详解
官网文档地址:https://docs.python.org/3/library/stdtypes.html#string-methods 官网 公号:软测小生ruancexiaosheng 文档里的 ...
随机推荐
- Sql server中如何将表A和表B的数据合并(乘积方式)
sql server中如何将表A 和表B的数据合并成乘积方式,也就是说表A有2条数据,表B有3条数据,乘积后有6条数据, 这就要用到sql中的笛卡尔积方式了 1.什么是笛卡尔积 笛卡尔积在SQL中的实 ...
- map的key 为指针
STL中map的key能否用char *呢?当然可以! 在程序中需要用到一个map,本来是这样写的,map<string, int> mapStr; 为了追求效率,把string改成了ch ...
- 请问微信小程序let和var以及const有什么区别
在JavaScript中有三种声明变量的方式:var.let.const. var:声明全局变量,换句话理解就是,声明在for循环中的变量,跳出for循环同样可以使用. [JavaScript] 纯文 ...
- Linux下IP的存储位置
在linux下,配置多个IP的话,通常是eth0... eth0. ..eth0.x等等, 那么如果要配置大量的IP呢,这么配置也是可以的,但是繁琐,虽说这种情况很少. 对于添加大量IP,有一定规定的 ...
- hdu 1057 A + B Again
A + B Again Problem Description There must be many A + B problems in our HDOJ , now a new one is com ...
- Linux命令----su(切换用户)以及passwd(修改用户密码)
一.su命令登录root 用户在使用telnet命令可以远程登录,但不可以登录root,这样就需要使用su命令来登录root用户. telnet登录(不能登录root)--- 1.启动终端 输入 te ...
- 第三篇 功能实现(1) (Android学习笔记)
第三篇 功能实现(1) 第8章 Android应用程序组成 ●Android的一些中.底层基础知识 ※ Android Framework 启动过程 Android手机系统本质上是一个基于Linux的 ...
- ssh框架中,工具类调用service层方法(参考https://www.cnblogs.com/l412382979/p/8526945.html)
代码如下: package common.dataService; import javax.annotation.PostConstruct; import org.springframework. ...
- Android开发 ---如何操作资源目录中的资源文件2
Android开发 ---如何操作资源目录中的资源文件2 一.颜色资源管理 效果图: 描述: 1.改变字体的背景颜色 2.改变字体颜色 3.改变按钮颜色 4.图像颜色切换 操作描述: 点击(1)中的颜 ...
- 第一个python程序--hello,world
Hello World程序 在linux 下创建一个文件叫hello.py,并输入 print ('hello,word') 然后执行:python3 hello.py ,输出: [root@IDC- ...