python - 只有当它访问了树中的每个目录时,`os.walk` 的替代方案才会抛出 StopIteration?
问题描述
os.walk
返回一个迭代器,该迭代器旨在访问某个树中的每个目录。当且仅当树中的每个目录都被访问时,我想要类似os.walk
的东西会抛出StopIteration
(或类似的东西) 。
os.walk
StopIteration
当树中的每个目录都被访问或在此过程中遇到一些错误时抛出。例如,考虑以下打印输出和错误消息:
checking for empty folders under F:\
checking for empty folders under F:\$RECYCLE.BIN
checking for empty folders under F:\$RECYCLE.BIN\S-1-5-18
Traceback (most recent call last):
File "D:/FILE_MGMT_PYTHON/DRIVER.PY", line 228, in remove_empty_dirs
directories = next(os.walk(cur))[1]
StopIteration
我的F:\
驱动器有数千个目录和文件。不可能所有的人都被访问过。
警告:我没有让F:\
根成为步行。
F:\$RECYCLE.BIN\S-1-5-18
是行走的根源。因此,迭代器永远不会“向上”F:\$RECYCLE.BIN\S-1-5-18
起初,我以为那F:\$RECYCLE.BIN\S-1-5-18
是空的,因此,树下F:\$RECYCLE.BIN\S-1-5-18
的最后一个目录是F:\$RECYCLE.BIN\S-1-5-18
但是,next(os.walk(path_to_an_empty_directory))
不会抛出StopIteration
import os
import pathlib
import shutil
if True:
path = pathlib.Path(os.getcwd()) / "I_am_a_directory"
if path.is_dir():
shutil.rmtree(path)
os.mkdir(path)
print(next(os.walk(path))[0])
print("os.walk did not raise ", StopIteration.__name__)
编辑:
我的代码看起来像这样:
import os
import pathlib
def take_a_walk(xpath):
ipath = pathlib.Path(str(xpath))
print(''.join(str(x) for x in [
"VISITED ", str(ipath)
]))
children = next(os.walk(ipath))[1]
children = [ipath / child for child in children]
for child in children:
take_a_walk(child)
return "Fahrvergnugen"
take_a_walk('F:\\')
解决方案
我们不需要替代os.walk
本身,我们只需要为参数分配一个onerror
参数。
默认情况下,如果在检查路径时遇到错误,则返回的迭代器os.walk
将跳过当前路径,并移动到下一个路径。
def r(err):
raise err
os.walk(path, onerror=r)
推荐阅读
- python - 如何将图像插入 sqlite3 数据库?
- r - GenomicRanges 在 R 上加载 DESeq2 库时出错
- vue.js - Vue vuetify v-dialog 防止屏幕滚动
- avfoundation - `AVMutableCompositionTrack.insertTimeRange` 失败并出现错误 -11800
- c# - Blazor WebAssembly API 中是否有 Json 的替代品?
- typescript - 如何在 Typescript 上做猫鼬模型自我参考?
- java - 在 java web 中使用 OWL API 获取 snap SPARQL 查询
- r - R:为什么 \s{2} 在正则表达式匹配中返回“\”,?并且新行与 \\n 或 \\r 和其他变体不匹配
- javascript - VueJS - 从递归树中获取输入值
- google-colaboratory - 使用 pip 在 Colab 上安装 pyodbc。我有一个错误