很抱歉,是否曾经有人问过这个问题,但是我找不到类似的问题,希望我输入时能推荐我一个问题。
方案:带有子文件夹和文件的手动创建的文件夹。我想在文件夹的每个级别执行特定功能。与其每次遇到错误都不会引发异常,我想将它们打印出来并继续执行循环,因此最后我会列出错误的完整列表。
这是使用我的代码的简化功能的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)
我尝试了以下带有装饰器功能的解决方案,但无法传递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
任何帮助将不胜感激!
答案 0 :(得分:1)
如果可以使用os.walk,则可以用Pythonic
的方式用几行代码来编写整个代码。
import os
for root, folders, files in os.walk(os.getcwd()):
for folder in folders:
print('dir is: ', folder)
try:
if len(folder) > 20:
raise Exception('Folder {} name too long'.format(folder))
except Exception as error_message:
print('Error in folder: {} due to: {}'.format(folder, error_message))
正如您在其他文件夹级别中指定的那样,您必须调用不同的函数,您可以尝试如下操作:
import os
curr_folder = os.getcwd()
for root, folders, files in os.walk(curr_folder):
for folder in folders:
print('dir is: ', folder)
folder_level = root[len(curr_folder)+1:].count(os.sep)
print('level is: ', folder_level)
if folder_level == 0:
# call myfunction0
pass
elif folder_level == 1:
# call myfunction1
pass
elif folder_level == 2:
# call myfunction2
pass