MicroPython手册之内置模块 stat

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的内置模块stat提供了一些用于处理文件状态的常量和函数。它的主要特点、应用场景,以及需注意事项如下:

主要特点:stat模块定义了一些常量,如stat.S_IFDIR, stat.S_IFREG等,用于表示文件的类型。stat模块还定义了一些函数,如stat.stat(path), stat.fstat(fd)等,用于获取文件的状态信息。文件的状态信息是一个元组,包含了文件的大小,修改时间,权限等属性。stat模块还提供了一些辅助函数,如stat.S_ISDIR(mode), stat.S_ISREG(mode)等,用于判断文件的类型。

应用场景:stat模块可以用于在文件系统中获取和处理文件的状态信息。例如,可以用stat模块判断一个路径是一个目录还是一个文件,或者获取一个文件的大小或修改时间等。

需注意事项:在使用stat模块之前,需要导入该模块,使用import stat语句。在使用stat模块的函数之前,需要确保文件或路径是存在的。否则,会抛出一个异常。另外,stat模块在不同的平台上可能有不同的实现和支持。因此,在使用stat模块时,最好先检查平台的特性和限制1。

以下是MicroPython的内置模块stat的几个实际运用程序案例:

案例一:在MicroPython板子上获取一个名为’test.txt’的文件的大小和修改时间。代码如下:

import os
import stat
import time

# 定义要获取状态信息的文件路径
path = 'test.txt'

# 获取文件的状态信息
st = os.stat(path)

# 获取文件的大小(字节)
size = st[6]

# 获取文件的修改时间(秒)
mtime = st[8]

# 格式化修改时间为字符串
mtime_str = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(mtime))

# 打印文件的大小和修改时间
print('The size of', path, 'is', size, 'bytes')
print('The last modified time of', path, 'is', mtime_str)

案例二:在MicroPython板子上判断一个名为’temp’的路径是一个目录还是一个文件。代码如下:

import os
import stat

# 定义要判断类型的路径
path = 'temp'

# 获取路径的状态信息
st = os.stat(path)

# 获取路径的类型(mode)
mode = st[0]

# 判断路径是否是一个目录
if stat.S_ISDIR(mode):
    print(path, 'is a directory')
# 判断路径是否是一个文件
elif stat.S_ISREG(mode):
    print(path, 'is a file')
# 其他情况
else:
    print(path, 'is neither a directory nor a file')

案例三:在MicroPython板子上修改一个名为’image.jpg’的文件的权限,使其只能被所有者读写。代码如下:

import os
import stat

# 定义要修改权限的文件路径
path = 'image.jpg'

# 获取文件的状态信息
st = os.stat(path)

# 获取文件的当前权限(mode)
mode = st[0]

# 计算新的权限(只保留所有者读写位)
new_mode = mode & (stat.S_IRUSR | stat.S_IWUSR)

# 修改文件的权限
os.chmod(path, new_mode)

# 打印修改后的权限
print('The new mode of', path, 'is', oct(new_mode))

案例四:获取文件信息:

import os
import stat

# 定义文件路径
file_path = "/home/pi/documents/file.txt"

# 获取文件信息
file_stat = os.stat(file_path)

# 打印文件信息
print("文件大小:", file_stat.st_size, "字节")
print("最后修改时间:", file_stat.st_mtime)
print("最后访问时间:", file_stat.st_atime)
print("文件权限:", stat.filemode(file_stat.st_mode))

在这个例子中,我们使用os模块的stat函数获取指定文件的信息。我们定义了文件路径,然后使用os.stat函数获取文件的stat对象。通过访问stat对象的属性,我们可以获取文件的大小(以字节为单位)、最后修改时间、最后访问时间以及文件权限。我们使用stat.filemode函数将权限值转换为可读形式,并打印出文件信息。

案例五:检查文件是否为目录:
 

import os

# 定义路径
path = "/home/pi/documents"

# 检查路径是否为目录
if os.path.isdir(path):
    print("该路径是一个目录")
else:
    print("该路径不是一个目录")

在这个例子中,我们使用os模块的isdir函数检查指定路径是否为目录。我们定义了路径,然后使用os.path.isdir函数检查该路径。如果路径是一个目录,我们打印出"该路径是一个目录"的消息。如果路径不是一个目录,我们打印出"该路径不是一个目录"的消息。

案例六:检查文件是否为普通文件:
 

import os

# 定义路径
path = "/home/pi/documents/file.txt"

# 检查路径是否为普通文件
if os.path.isfile(path):
    print("该路径是一个普通文件")
else:
    print("该路径不是一个普通文件")

在这个例子中,我们使用os模块的isfile函数检查指定路径是否为普通文件。我们定义了路径,然后使用os.path.isfile函数检查该路径。如果路径是一个普通文件,我们打印出"该路径是一个普通文件"的消息。如果路径不是一个普通文件,我们打印出"该路径不是一个普通文件"的消息。

案例七:获取文件的大小、创建时间和修改时间
 

import uos

# 获取文件 "data.txt" 的状态信息
file_stat = uos.stat("data.txt")

# 提取文件大小
file_size = file_stat[6]
print("文件大小:", file_size, "字节")

# 提取文件的创建时间和修改时间
create_time = file_stat[8]
modify_time = file_stat[9]
print("创建时间:", create_time)
print("修改时间:", modify_time)

这个例子使用 uos.stat() 函数获取文件 “data.txt” 的状态信息,并从返回的元组中提取文件的大小、创建时间和修改时间。

案例八: 检查文件是否为目录

import uos

# 检查文件 "data" 是否为目录
file_stat = uos.stat("data")
is_directory = file_stat[0] & 0x4000  # 目录的标志位为 0x4000

if is_directory:
    print("文件是一个目录")
else:
    print("文件不是一个目录")

在这个例子中,我们使用 uos.stat() 函数获取文件 “data” 的状态信息,并通过检查返回的标志位来确定该文件是否为目录。

案例九:获取文件的访问权限

import uos

# 获取文件 "script.py" 的访问权限
file_stat = uos.stat("script.py")
access_permissions = file_stat[0] & 0o777  # 通过掩码提取访问权限

print("访问权限:", oct(access_permissions))

在这个例子中,我们使用 uos.stat() 函数获取文件 “script.py” 的状态信息,并通过掩码方式提取文件的访问权限。返回的访问权限是一个八进制数值,可以使用 oct() 函数将其转换为八进制表示。

这些案例展示了 uos.stat() 函数的实际应用,包括获取文件的大小、创建时间和修改时间、检查文件是否为目录以及获取文件的访问权限。通过使用 stat 函数,你可以在 MicroPython 设备上方便地获取文件的状态信息,并根据需要进行进一步的处理和判断。请注意,在使用 stat 函数时,请确保有足够的权限和合理的路径设置,并根据实际需求进行适当的调整和处理。