MicroPython手册之内置模块 ilistdir

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的内置模块ilistdir是一个用于列出文件系统中的文件或目录的函数,它是uos模块的一部分,可以用来在不同的文件系统或目录中遍历。本文将从以下几个方面介绍ilistdir函数的主要特点、应用场景,以及需注意事项,并给出几个实际运用程序案例。

主要特点

1、ilistdir函数接受一个可选的字符串参数,表示要列出的目录的路径。如果省略该参数,则默认为当前工作目录。路径可以包含不同的文件系统或驱动器的前缀,例如/flash、/sd等。
2、ilistdir函数返回一个迭代器对象,可以用for循环或next函数来遍历。每次迭代返回一个元组,包含四个元素,分别是:
文件或目录的名称(字符串)
文件或目录的类型(整数),0表示普通文件,1表示子目录,2表示软链接
文件或目录的大小(整数),以字节为单位
文件或目录的属性(整数),按位表示不同的标志,例如只读、隐藏、系统等
3、ilistdir函数使用的路径语法是CPython os模块的一个子集,也是POSIX标准路径语法的一个子集。支持的分隔符有:/和。不支持的有:~和.等。

应用场景

1、ilistdir函数可以用于列出文件系统中的文件或目录,例如在启动或调试时打印文件系统的内容,或者在交互式环境中浏览不同位置的文件或目录。
2、ilistdir函数可以用于与其他文件系统操作函数配合使用,例如根据文件或目录的类型、大小、属性进行筛选、排序、统计等操作。
3、ilistdir函数可以用于实现一些类似于操作系统命令行的功能,例如ls、dir等。

需注意事项

1、ilistdir函数的功能和性能可能因不同的端口而异,因此在开发可移植的MicroPython应用程序时,应该尽量避免依赖特定的路径语法或结果。
2、ilistdir函数在编译和执行路径列举操作时可能会消耗较少的内存和时间,因此在处理简单或常规的路径列举时,不需要特别优化代码和资源管理。
3、ilistdir函数在编译和执行路径列举操作时可能会遇到无效或不合法的路径、参数、数据等,或者文件错误、权限错误、设备错误等异常情况。这些情况会引发OSError异常,并给出错误信息。应该使用try-except语句来捕获并处理这些异常。

实际运用程序案例

案例一:使用ilistdir函数列出内部闪存根目录下的内容,并打印出来

import uos

# 使用ilistdir函数列出内部闪存根目录下的内容
lst = uos.ilistdir('/flash')

# 使用for循环遍历迭代器对象
for item in lst:
    # 从元组中提取文件或目录的名称、类型、大小和属性
    name, type, size, attr = item
    # 打印文件或目录的信息
    print('Name:', name)
    print('Type:', type)
    print('Size:', size)
    print('Attr:', attr)
    # 打印空行
    print()

案例二:使用ilistdir函数统计SD卡上所有普通文件的总大小,并打印出来

import uos

# 定义一个变量,用于存储总大小
total_size = 0

# 使用ilistdir函数列出SD卡上所有文件和目录
lst = uos.ilistdir('/sd')

# 使用for循环遍历迭代器对象
for item in lst:
    # 从元组中提取文件或目录的类型和大小
    type, size = item[1], item[2]
    # 如果类型是0,表示是普通文件,则将大小累加到总大小中
    if type == 0:
        total_size += size

# 打印总大小
print('Total size:', total_size)

案例三:使用ilistdir函数实现一个类似于操作系统命令行的交互式环境

import uos

# 定义一个循环标志变量
running = True

# 循环等待用户输入命令
while running:
    # 获取当前工作目录,并显示为提示符
    cwd = uos.getcwd()
    print(cwd + '>', end=' ')
    # 读取用户输入的命令,并去掉两端空白字符
    cmd = input().strip()
    # 根据不同的命令执行不同的操作
    if cmd == 'exit':
        # 如果命令是exit,则退出循环
        running = False
    elif cmd == 'pwd':
        # 如果命令是pwd,则打印当前工作目录
        print(cwd)
    elif cmd.startswith('cd'):
        # 如果命令是以cd开头,则尝试切换到给定的目录
        try:
            # 从命令中提取目录路径
            path = cmd[3:]
            # 使用chdir函数切换到目录路径
            uos.chdir(path)
        except OSError as e:
            # 如果出现异常,则打印错误信息
            print(e)
    elif cmd == 'ls':
        # 如果命令是ls,则列出当前工作目录下的内容
        lst = uos.ilistdir()
        for item in lst:
            # 从元组中提取文件或目录的名称、类型、大小和属性
            name, type, size, attr = item
            # 打印文件或目录的信息,用逗号分隔
            print(name, type, size, attr, sep=',')
    else:
        # 否则,打印无效的命令信息
        print('Invalid command:', cmd)

# 打印退出信息
print('Bye')

 案例四:显示文件夹中的所有目录:

import os

# 定义目标文件夹
folder = "/home/pi/projects"

# 获取目录项生成器
dirs = os.ilistdir(folder)

# 打印所有目录
print("目录列表:")
for entry in dirs:
    if entry[1] == 0x4000:  # 判断是否为目录
        print(entry[0])

在这个例子中,我们使用os模块的ilistdir函数获取指定文件夹中的目录项生成器。然后,我们遍历生成器中的每个目录项,如果该项是目录(通过标志0x4000判断),则打印出来。

案例五:统计文件夹中的文件数量:

import os

# 定义目标文件夹
folder = "/home/pi/documents"

# 获取目录项生成器
entries = os.ilistdir(folder)

# 统计文件数量
file_count = sum(1 for entry in entries if entry[1] == 0x8000)

# 打印文件数量
print("文件夹中的文件数量:", file_count)

在这个例子中,我们使用os模块的ilistdir函数获取指定文件夹中的目录项生成器。然后,我们使用列表推导式计算生成器中符合条件(通过标志0x8000判断是否为文件)的项的数量。最后,打印出文件夹中的文件数量。

案例六:计算文件夹的总大小:

import os

# 定义目标文件夹
folder = "/home/pi/photos"

# 获取目录项生成器
entries = os.ilistdir(folder)

# 计算总大小
total_size = sum(entry[3] for entry in entries if entry[1] == 0x8000)

# 打印总大小
print("文件夹的总大小(字节):", total_size)

在这个例子中,我们使用os模块的ilistdir函数获取指定文件夹中的目录项生成器。然后,我们使用列表推导式计算生成器中符合条件(通过标志0x8000判断是否为文件)的每个项的大小,并将它们累加起来。最后,打印出文件夹的总大小(以字节为单位)。

案例七:列出目录中的文件和子目录

import uos

# 列出当前目录中的所有文件和子目录
items = uos.ilistdir()

# 遍历目录中的条目
for item in items:
    name, type = item
    print("名称:", name)
    print("类型:", type)
    print("--------------------")

这个例子使用 uos.ilistdir() 函数列出当前目录中的所有文件和子目录,并将结果存储在 items 变量中。然后,我们使用循环迭代 items,并将每个条目的名称和类型打印出来。

案例八: 递归遍历目录树

import uos

# 递归遍历目录树
def traverse_directory(directory):
    items = uos.ilistdir(directory)
    for item in items:
        name, type = item
        if type == 0x4000:  # 目录
            subdir = directory + '/' + name
            print("目录:", subdir)
            traverse_directory(subdir)
        else:  # 文件
            file_path = directory + '/' + name
            print("文件:", file_path)

# 从根目录开始遍历
traverse_directory('/')

在这个例子中,我们定义了一个名为 traverse_directory 的函数,用于递归遍历目录树。我们首先调用 uos.ilistdir() 函数获取指定目录中的条目,并使用循环迭代每个条目。如果条目的类型为目录(0x4000),则递归调用 traverse_directory 函数,传入子目录的路径。如果条目的类型为文件,我们将打印该文件的路径。

案例九: 筛选特定类型的文件
 

import uos

# 列出当前目录中的所有 Python 脚本文件
items = uos.ilistdir()
for item in items:
    name, type = item
    if type == 0x8000:  # 文件
        if name.endswith('.py'):
            print("Python 脚本文件:", name)

这个例子使用 uos.ilistdir() 函数列出当前目录中的所有文件和子目录,并使用循环迭代每个条目。我们通过判断条目的类型是否为文件(0x8000),并检查文件名是否以 “.py” 结尾来筛选出 Python 脚本文件,并将其打印出来。

这些案例展示了 uos.ilistdir() 函数的实际应用,包括列出目录中的文件和子目录、递归遍历目录树以及筛选特定类型的文件。通过使用 ilistdir 函数,你可以在 MicroPython 设备上灵活地处理文件和目录,并根据需要进行进一步的操作和处理。请注意,在使用 ilistdir 函数时,需要根据具体的应用场景和需求进行适当的调整和处理。