如何使用 MicroPython 遍历文件夹中的文件?

How to iterate through files in a folder using MicroPython?

我正在尝试使用 MicroPython.

读取 SD 卡中所有扩展名为 .asm.py 的文件

我检查了 this question 中的答案,但它们不适用于 MicroPython。

MicroPython 没有 glob 也没有 pathlib,当使用 os 库并尝试此代码时:

for file in os.listdir('/sd'):
        filename = os.fsdecode(file)
        if filename.endswith(".asm") or filename.endswith(".py"):
            print(filename)

我收到这个错误'module' object has no attribute 'fsdecode'

我怎样才能让它与 MicroPython 一起工作?

你在正确的轨道上,os.listdir 在任何版本的 MicroPython 上工作得很好,但不会递归 sub-folders。

所以你需要区分文件夹和文件节点,如下所示。

"""Clean all files from flash 
use with care ; there is no undo or trashcan 
"""
import uos as os 

def wipe_dir( path=".",sub=True):
        print( "wipe path {}".format(path) )
        l = os.listdir(path)
        l.sort()
        #print(l)
        if l != ['']:
            for f in l:
                child = "{}/{}".format(path, f)
                #print(" - "+child)
                st = os.stat(child)
                if st[0] & 0x4000:  # stat.S_IFDIR
                    if sub:
                        wipe_dir(child,sub)
                        try:
                            os.rmdir(child)
                        except:
                            print("Error deleting folder {}".format(child))
                else: # File
                    try:  
                        os.remove(child)
                    except:
                        print("Error deleting file {}".format(child))

# wipe_dir(path='/')

对于一个简单的 listdir,你不需要 fsdecode,事实上它不是 MicroPython os module 的一部分 请记住,MicroPython 具有优化的 sub-set 模块和方法。

for filename in os.listdir("/sd"):
    if filename.endswith(".asm") or filename.endswith(".py"):
        print(filename)

实际上,为了避免子文件夹,您应该检查类型,可以使用 os.ilistdir

找到
for entry in os.ilistdir("/sd"):
    # print(entry)
    if entry[1] == 0x8000:
        filename = entry[0]
        if filename.endswith(".asm") or filename.endswith(".py"):
            print(filename)