【雕爷学编程】MicroPython手册之文件操作模块 statvfs

在这里插入图片描述

MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。

在这里插入图片描述

MicroPython的statvfs方法是用于获取一个文件系统的状态信息的方法,它返回一个包含10个元素的元组,表示不同的状态属性。它的主要特点有:

它接受一个必需的参数,表示要获取状态信息的文件系统的路径。路径可以是绝对路径或相对路径,可以是字符串或字节对象。

它可以获取不同类型的文件系统的状态信息,如内置闪存、外部存储卡、网络文件系统等。它会根据文件系统的类型和属性来返回相应的状态信息,如总空间、可用空间、块大小等。

它会在获取状态信息后,返回一个包含10个元素的元组,每个元素表示一个状态属性。元组中的元素分别是:

f_bsize:表示文件系统中每个块的大小,单位为字节,是一个整数。
f_frsize:表示文件系统中每个片段的大小,单位为字节,是一个整数。片段是文件系统中分配空间的最小单位,通常等于块大小。
f_blocks:表示文件系统中总共有多少个块,是一个整数。
f_bfree:表示文件系统中总共有多少个空闲块,是一个整数。
f_bavail:表示文件系统中对普通用户可用的空闲块数,是一个整数。这个值可能小于f_bfree,因为一些空闲块可能被保留给超级用户或其他目的。
f_files:表示文件系统中总共有多少个索引节点(inode),是一个整数。索引节点是文件系统中用于标识文件或目录的唯一编号。
f_ffree:表示文件系统中总共有多少个空闲索引节点,是一个整数。
f_favail:表示文件系统中对普通用户可用的空闲索引节点数,是一个整数。这个值可能小于f_ffree,因为一些空闲索引节点可能被保留给超级用户或其他目的。
f_flag:表示文件系统的标志位,是一个整数。标志位是用来表示文件系统的一些特性或限制,如只读、无执行等。可以使用uos.statvfs_result类中定义的常量来解析该值,如ST_RDONLY表示只读标志位等。
f_namemax:表示文件系统中每个文件或目录名的最大长度,单位为字节,是一个整数。

MicroPython的statvfs方法的应用场景有:

获取文件系统信息:可以使用statvfs方法来获取一个已存在的文件系统的信息,并进行处理或分析。例如,可以获取内置闪存或外部存储卡的总空间、可用空间、块大小等,并打印出来。
检查文件系统状态:可以使用statvfs方法来检查一个已存在的文件系统的状态,并进行相应的操作。例如,可以检查网络文件系统是否可读、可写、可执行等,并执行不同的函数。
计算文件系统容量:可以使用statvfs方法来计算一个已存在的文件系统的容量,并进行比较或评估。例如,可以计算内置闪存或外部存储卡的已用百分比、剩余百分比、平均每个文件或目录占用空间等,并显示进度条或百分数。

MicroPython的statvfs方法需注意事项有:

获取状态信息时需要指定正确的路径,否则可能会出现错误或异常。
获取状态信息时需要考虑不同平台和文件系统的差异,否则可能会导致数据不准确或不兼容。
获取状态信息时可能会出现异常,需要使用try-except语句来捕获和处理。

MicroPython的statvfs方法几个实际运用程序案例如下:

案例1:获取内置闪存的总空间、可用空间、块大小,并打印出来::

import uos

# 定义内置闪存的路径
path = '/flash'

# 获取该文件系统的状态信息,返回一个元组
stat = uos.statvfs(path)

# 从元组中提取需要的信息
bsize = stat[0] # f_bsize
bfree = stat[3] # f_bfree
blocks = stat[2] # f_blocks

# 计算总空间和可用空间,单位为字节
total = bsize * blocks
free = bsize * bfree

# 打印信息
print('The total space of /flash is', total, 'bytes')
print('The available space of /flash is', free, 'bytes')
print('The block size of /flash is', bsize, 'bytes')

案例2:检查网络文件系统是否可读、可写、可执行,并执行不同的函数::

import uos

# 定义网络文件系统的路径
path = '/mnt/nfs'

# 获取该文件系统的状态信息,返回一个元组
stat = uos.statvfs(path)

# 从元组中提取标志位信息
flag = stat[8] # f_flag

# 定义不同标志位对应的函数
def do_read():
    print('This file system is readable')

def do_write():
    print('This file system is writable')

def do_exec():
    print('This file system is executable')

def do_other():
    print('This file system has other flags')

# 判断标志位,并执行相应的函数
if flag & uos.statvfs_result.ST_RDONLY: # 只读标志位
    do_read()
elif flag & uos.statvfs_result.ST_NOSUID: # 无执行标志位
    do_exec()
elif flag & uos.statvfs_result.ST_NODEV: # 无写入标志位
    do_write()
else: # 其他标志位
    do_other()

案例3:计算外部存储卡的已用百分比、剩余百分比、平均每个文件或目录占用空间,并显示进度条或百分数::

import uos

# 定义外部存储卡的路径
path = '/sd'

# 获取该文件系统的状态信息,返回一个元组
stat = uos.statvfs(path)

# 从元组中提取需要的信息
bsize = stat[0] # f_bsize
bfree = stat[3] # f_bfree
blocks = stat[2] # f_blocks
files = stat[5] # f_files

# 计算总空间和可用空间,单位为字节
total = bsize * blocks
free = bsize * bfree

# 计算已用空间和剩余空间,单位为字节
used = total - free
remain = free

# 计算已用百分比和剩余百分比,保留两位小数
used_percent = round(used / total * 100, 2)
remain_percent = round(remain / total * 100, 2)

# 计算平均每个文件或目录占用空间,单位为字节,向上取整
average_size = (used + remain) // files

# 打印信息
print('The used percentage of /sd is', used_percent, '%')
print('The remaining percentage of /sd is', remain_percent, '%')
print('The average size of each file or directory in /sd is', average_size, 'bytes')

# 显示进度条,使用*表示已用空间,使用-表示剩余空间,共20个字符长度
progress_bar = '*' * int(used_percent / 5) + '-' * int(remain_percent / 5)
print('The progress bar of /sd is', progress_bar)

案例4:获取文件系统信息:

import uos

# 获取文件系统信息
fs_info = uos.statvfs("/")

# 打印文件系统总空间
total_space = fs_info[0] * fs_info[2]
print("文件系统总空间:", total_space, "字节")

# 打印文件系统可用空间
available_space = fs_info[0] * fs_info[3]
print("文件系统可用空间:", available_space, "字节")

在这个例子中,我们使用uos模块的statvfs函数获取根目录(“/”)的文件系统信息,并将其存储在变量fs_info中。然后,我们使用fs_info元组的元素进行计算,得到文件系统的总空间和可用空间,并将其打印出来。

案例5:检查文件系统类型::

import uos

# 获取文件系统信息
fs_info = uos.statvfs("/")

# 检查文件系统类型
if fs_info[0] == 4096:
    print("文件系统类型:FAT")
else:
    print("文件系统类型:其他")

在这个例子中,我们使用uos模块的statvfs函数获取根目录(“/”)的文件系统信息,并将其存储在变量fs_info中。然后,我们检查fs_info元组的第一个元素的值,如果等于4096,说明文件系统类型为FAT。根据检查结果,我们打印出相应的文件系统类型。

案例6:获取文件系统块大小::

import uos

# 获取文件系统信息
fs_info = uos.statvfs("/")

# 获取文件系统块大小
block_size = fs_info[1]

print("文件系统块大小:", block_size, "字节")

在这个例子中,我们使用uos模块的statvfs函数获取根目录(“/”)的文件系统信息,并将其存储在变量fs_info中。然后,我们获取fs_info元组的第二个元素的值,即文件系统的块大小,并将其打印出来。

案例7: 获取文件系统的总空间和可用空间

import uos

# 获取文件系统的信息
fs_stat = uos.statvfs("/")

# 提取文件系统的总空间和可用空间
total_space = fs_stat[0] * fs_stat[2]
available_space = fs_stat[0] * fs_stat[3]

print("Total space:", total_space)
print("Available space:", available_space)

在这个例子中,我们使用 uos.statvfs() 函数获取根目录文件系统的信息,并将其存储在 fs_stat 变量中。然后,我们从 fs_stat 中提取文件系统的块大小(第0个元素)和块数量(第2个元素和第3个元素)。通过将块大小乘以块数量,我们可以计算出文件系统的总空间和可用空间。

案例8: 获取文件系统的块大小

import uos

# 获取文件系统的信息
fs_stat = uos.statvfs("/")

# 提取文件系统的块大小
block_size = fs_stat[0]

print("Block size:", block_size)

在这个例子中,我们使用 uos.statvfs() 函数获取根目录文件系统的信息,并将其存储在 fs_stat 变量中。然后,我们从 fs_stat 中提取文件系统的块大小(第0个元素),并将其存储在 block_size 变量中。

案例9:获取文件系统的可用块数:

import uos

# 获取文件系统的信息
fs_stat = uos.statvfs("/")

# 提取文件系统的可用块数量
available_blocks = fs_stat[3]

print("Available blocks:", available_blocks)

在这个例子中,我们使用 uos.statvfs() 函数获取根目录文件系统的信息,并将其存储在 fs_stat 变量中。然后,我们从 fs_stat 中提取文件系统的可用块数量(第3个元素),并将其存储在 available_blocks 变量中。

这些案例展示了 MicroPython 中 uos.statvfs() 函数的实际应用,用于获取文件系统的信息。您可以根据具体的应用场景和需求,使用 uos.statvfs() 函数来获取文件系统的不同属性。

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
`statvfs`是一个用于获取文件系统相关信息的结构体,定义在头文件`<sys/statvfs.h>`中。它包含以下成员: ```c struct statvfs { unsigned long f_bsize; /* 文件系统块大小 */ unsigned long f_frsize; /* 分根大小 */ fsblkcnt_t f_blocks; /* 文件系统中总块数 */ fsblkcnt_t f_bfree; /* 文件系统中可用块数 */ fsblkcnt_t f_bavail; /* 文件系统中非特权进程可用块数 */ fsfilcnt_t f_files; /* 文件系统中总文件节点数 */ fsfilcnt_t f_ffree; /* 文件系统中可用文件节点数 */ fsfilcnt_t f_favail; /* 文件系统中非特权进程可用文件节点数 */ unsigned long f_fsid; /* 文件系统标识符 */ unsigned long f_flag; /* 挂在标志 */ unsigned long f_namemax; /* 文件名最大长度 */ }; ``` 下面是每个成员的详细说明: - `f_bsize`:文件系统块大小,以字节为单位。 - `f_frsize`:分根大小,即最小可分配的文件系统块的大小,以字节为单位。 - `f_blocks`:文件系统中总块数,以块为单位。 - `f_bfree`:文件系统中可用块数,以块为单位。注意,这是指非超级用户可用的块数,超级用户可用的块数可能会更多。 - `f_bavail`:文件系统中非特权进程可用块数,以块为单位。这是指对具有“可删除”的文件或目录进行操作时可用的块数。注意,这是指非超级用户可用的块数,超级用户可用的块数可能会更多。 - `f_files`:文件系统中总文件节点数,以节点(inode)为单位。 - `f_ffree`:文件系统中可用文件节点数,以节点为单位。注意,这是指非超级用户可用的文件节点数,超级用户可用的文件节点数可能会更多。 - `f_favail`:文件系统中非特权进程可用文件节点数,以节点为单位。这是指对具有“可删除”的文件或目录进行操作时可用的文件节点数。注意,这是指非超级用户可用的文件节点数,超级用户可用的文件节点数可能会更多。 - `f_fsid`:文件系统标识符,通常是一个随机数。它被用来唯一地标识一个文件系统,不同的文件系统应该有不同的标识符。 - `f_flag`:文件系统挂载标志,包括以下标志: - `ST_RDONLY`:只读文件系统。 - `ST_NOSUID`:禁用 set-user-ID 和 set-group-ID 位。 - `ST_NODEV`:禁用设备文件。 - `ST_NOEXEC`:禁用执行文件。 - `ST_SYNCHRONOUS`:同步写入文件系统。 - `ST_MANDLOCK`:强制锁定文件,以防止其他进程修改文件。 - `ST_WRITE`:文件系统支持写操作。 - `f_namemax`:文件名最大长度,以字节为单位。 `statvfs`结构体提供了丰富的文件系统信息,可以用来进行磁盘空间的监控、限制以及优化等操作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值