尝试使用 Micropython 遍历(遍历)esp32 的目录
Trying to traverse (walk) the directory of an esp32 using Micropython
```
# try.py
import uos
dir = 16384
def walk(t): # recursive function
print('-',t)
w = uos.ilistdir(t)
for x in w:
L = list(x)
print(L[0], L[1], L[3])
if L[1] == dir:
walk(L[0])
else:
return
z = uos.ilistdir()
for x in z:
L = list(x)
print(L[0], L[1], L[3])
if L[1] == dir:
walk(L[0])
```
代码在第7行报错停止,报错:
输出:
Traverse.py 32768 773
boot.py 32768 139
库 16384 0
-库
一个 16384 0
-一个
回溯(最近调用最后):
中的文件“stdin”,第 21 行
文件“stdi>”,第 12 行,正在运行
文件“
OSError: [Errno 2] ENOENT
目录结构为:
库
one
two
three
three.py
boot.py
main.py
one.py
Traverse.py
好像停在了一个没有文件的目录上
没有要测试的 ESP,但这里有一些问题:
- 如果条目是一个文件,你不应该 return 而是继续,这就是它停止得太快的原因
- 你应该跳过当前目录和父目录以避免无限递归
- 当递归时你必须在顶层目录之前,这可能是错误的原因,即你的代码调用
walk('two')
但没有这样的目录,它必须是 one/two
)
- 您可以在当前目录上使用 walk 函数,这样就不需要在最后一点复制实现了。
此外:
- 迭代
ilistdir
returns tuple
s 也可以被索引所以不需要将它转换成 list
- 并将集合直接传递给
print
也可以,不需要单独的 print(x[0], x[1], ...
)
Adpatation,完整路径的打印略有不同,因此更容易理解:
import uos
dir_code = 16384
def walk(t):
print('-', t)
for x in uos.ilistdir(t):
print(x)
if x[1] == dir_code and x[0] != '.' and x[0] != '..':
walk(t + '/' + x[0])
walk('.')
这仍然会打印目录两次,添加所有索引使内容难以阅读。适配元组解包打印目录一次:
import uos
dir_code = 16384
def walk(top):
print(top)
for name, code, _ in uos.ilistdir(top):
if code != dir_code:
print(top + '/' + name)
elif name not in ('.', '..'):
walk(top + '/' + name)
walk('.')
```
# try.py
import uos
dir = 16384
def walk(t): # recursive function
print('-',t)
w = uos.ilistdir(t)
for x in w:
L = list(x)
print(L[0], L[1], L[3])
if L[1] == dir:
walk(L[0])
else:
return
z = uos.ilistdir()
for x in z:
L = list(x)
print(L[0], L[1], L[3])
if L[1] == dir:
walk(L[0])
```
代码在第7行报错停止,报错:
输出:
Traverse.py 32768 773
boot.py 32768 139
库 16384 0
-库
一个 16384 0
-一个
回溯(最近调用最后):
中的文件“stdin”,第 21 行文件“stdi>”,第 12 行,正在运行
文件“ OSError: [Errno 2] ENOENT 目录结构为: 库 boot.py main.py one.py Traverse.py 好像停在了一个没有文件的目录上one
two
three
three.py
没有要测试的 ESP,但这里有一些问题:
- 如果条目是一个文件,你不应该 return 而是继续,这就是它停止得太快的原因
- 你应该跳过当前目录和父目录以避免无限递归
- 当递归时你必须在顶层目录之前,这可能是错误的原因,即你的代码调用
walk('two')
但没有这样的目录,它必须是one/two
) - 您可以在当前目录上使用 walk 函数,这样就不需要在最后一点复制实现了。
此外:
- 迭代
ilistdir
returnstuple
s 也可以被索引所以不需要将它转换成list
- 并将集合直接传递给
print
也可以,不需要单独的print(x[0], x[1], ...
)
Adpatation,完整路径的打印略有不同,因此更容易理解:
import uos
dir_code = 16384
def walk(t):
print('-', t)
for x in uos.ilistdir(t):
print(x)
if x[1] == dir_code and x[0] != '.' and x[0] != '..':
walk(t + '/' + x[0])
walk('.')
这仍然会打印目录两次,添加所有索引使内容难以阅读。适配元组解包打印目录一次:
import uos
dir_code = 16384
def walk(top):
print(top)
for name, code, _ in uos.ilistdir(top):
if code != dir_code:
print(top + '/' + name)
elif name not in ('.', '..'):
walk(top + '/' + name)
walk('.')