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)