"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.BINS-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.BINS-1-5-18是步行的根源。因此,迭代器永远不会"上升"到F:$RECYCLE.BINS-1-5-18

起初,我以为F:$RECYCLE.BINS-1-5-18是空的,所以,F:$RECYCLE.BINS-1-5-18是树下的最后一个目录,根植于F:$RECYCLE.BINS-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)

相关内容

  • 没有找到相关文章

最新更新