如果以前有人问过这个问题,我深表歉意,但我找不到类似的问题,希望在我打字时能给我推荐一个
场景:手动创建包含子文件夹和文件的文件夹。在文件夹的每个级别上,我都希望执行特定的功能。我不希望每次遇到错误时都引发异常,而是将它们打印出来并继续循环,以便在最后有一个完整的错误列表
下面是一个MWE,它使用了我的代码的简化函数:
import os, stat
def folder_info(folder):
if len(folder) > 20:
raise Exception('Folder {} name too long'.format(folder))
print(folder)
subfolders = os.listdir(folder)
return len(folder), subfolders
raise_error = False
folders = [f for f in os.listdir() if os.path.isdir(f)]
for folder in folders:
try:
length, subfolders = folder_info(folder)
except Exception as error:
if raise_error: raise
print('Error: {}'.format(error))
continue
for subfolder in subfolders:
subfolder = os.path.join(folder, subfolder)
try:
length, subfolders = folder_info(subfolder)
except Exception as error:
if raise_error: raise
print('Error: {}'.format(error))
continue
理想情况下,我希望不必为每个嵌套循环键入try
和except
语句。我希望的是:
for folder in folders:
arg1, arg2 = exceptionwrapper(myfunction1(folder), raise_error)
for subfolder in arg2:
subfolder = os.path.join(folder, subfolder)
arg1, arg2, arg3 = exceptionwrapper(myfunction2(subfolder), raise_error)
for subsubfolder in arg3:
arg1, arg2 = exceptionwrapper(myfunction3(subsubfolders), raise_error)
我尝试了使用decorator函数的以下解决方案,但我无法传入continue
或找出它应该放在哪里。这是我最好的尝试,我试图传入continue
时出现语法错误:
def exceptionwrapper(function, raise_error, after_error: function = continue):
def decorator(func):
def new_func(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as error:
if raise_error: raise
print('Error: {}'.format(error))
return after_error
return new_func
return decorator
任何帮助都将不胜感激
如果您可以使用os.walk,那么您的整个代码可以用
Pythonic
的方式写在几行中由于您在不同的文件夹级别指定了不同的函数,因此必须调用不同的函数,您可以尝试以下操作:
相关问题 更多 >
编程相关推荐