首页 > 解决方案 > 只有当它访问了树中的每个目录时,`os.walk` 的替代方案才会抛出 StopIteration?

问题描述

os.walk返回一个迭代器,该迭代器旨在访问某个树中的每个目录。当且仅当树中的每个目录都被访问时,我想要类似os.walk的东西会抛出StopIteration(或类似的东西) 。

os.walkStopIteration当树中的每个目录都被访问在此过程中遇到一些错误时抛出。例如,考虑以下打印输出和错误消息:

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:\\')

标签: pythonpython-3.xpathfilepathhierarchy

解决方案


我们不需要替代os.walk本身,我们只需要为参数分配一个onerror参数。

默认情况下,如果在检查路径时遇到错误,则返回的迭代器os.walk将跳过当前路径,并移动到下一个路径。

def r(err):
    raise err

os.walk(path, onerror=r)

推荐阅读