首页 > 解决方案 > 如何返回到for循环中的特定点?

问题描述

我有一系列嵌套循环,循环遍历许多 excel 文件,并根据对内容的检查,将内容添加到数据框列表中。

在某种情况下我需要跳出当前循环,不添加到数据框列表,继续解析下一个excel。不幸的是,我无法弄清楚如何设置循环以完成我想要的行为。

目前代码如下。我添加了解释我正在寻找什么行为的评论。

for name in folder_names:
path = rf'I:\PATH\{name}'
file_list = [f for f in glob.glob(path+"/*.xlsx")]
df_list = []
for f in file_list: #if a break event is triggered, I need to return here.
    xl = pd.ExcelFile(f)
    if len(xl.sheet_names) == 1:
        wb = load_workbook(f, data_only = True)
        sh = wb.worksheets[0]
        ColNames = {}
        Current  = 0
        for COL in sh.iter_cols(1, sh.max_column):
            ColNames[COL[0].value] = Current
            Current += 1
        for row_cells in sh.iter_rows(min_row=2, max_row=len(sh['D'])):
            if row_cells[ColNames['XXXX ID']].fill.start_color.index != '00000000':
                path_file.write(f+'\n') 
                break                
        df_list.append(pd.read_excel(f)) #if a break event is triggered, I need this line to NOT be executed

所需的逻辑:

如果当前 excel 只有一张表,则检查 D 列是否没有单元格填充颜色,如果为 true,则添加到数据框列表,如果为 false,则循环返回到下一个 excel 文件。

标签: pythonpython-3.x

解决方案


你可以写一个for ... else ...声明。

for i in range(5):
    print(i)
    if i > 2:
        print("Hit break")
        break
else:
    print("I didn't hit a break inside the loop")
0
1
2
3
击中休息
for i in range(5):
    print(i)
    if i > 2:
        pass
else:
    print("I didn't hit a break inside the loop")
0
1
2
3
4
我没有在循环内打断

所以要回答你的问题,你只需要这样做:

...
for row_cells in sh.iter_rows(min_row=2, max_row=len(sh['D'])):
    if row_cells[ColNames['XXXX ID']].fill.start_color.index != '00000000':
        path_file.write(f+'\n') 
        break
else: # <- add this line and indent your code
    df_list.append(pd.read_excel(f))

推荐阅读