Python range循环超行索引仍填充数据,如何终止无效列填充?
问题与解决方案
问题描述
现有变量设置:
no_of_sheet_b = 6 row_count_b = 39
预期行为:当生成第7个工作表(j=7)时,将DataFrame df_s 的第37、38、39行数据分别复制到worksheet_for_b的第10、14、18列,第22、26、30列保持为空。
实际问题:当row_index超过row_count_b后,i循环仍会完成迭代,导致Sheet7的22、26、30列被Sheet6的旧数据填充。需要让i循环在row_index > row_count_b时立即停止填充列。
原代码:
row_index = 0 location_value = df_s.at[row_index, "Column 1"] sample_no_value = df_s.at[row_index, "Column 2"] top_depth_value = df_s.at[row_index, "Column 3"] # Iterate over the rows of df_s for j in range(1, no_of_sheet_b + 1, 1): for i in range(10, 31, 4): # Check if row_index is within the valid range if row_index < row_count_b: # Copy the data to the appropriate cells in worksheet_for_b worksheet_for_b.cell(row=9, column=i).value = location_value worksheet_for_b.cell(row=12, column=i).value = sample_no_value worksheet_for_b.cell(row=15, column=i).value = top_depth_value worksheet_for_b.cell(row=7, column=4, value=f'{date_assigned}') worksheet_for_b.cell(row=7, column=12, value=f'{project_name}') worksheet_for_b.cell(row=7, column=24, value=f'{job_no}') # jump to next row row_index += 1 if row_index < row_count_b: location_value = df_s.at[row_index, "Column 1"] sample_no_value = df_s.at[row_index, "Column 2"] top_depth_value = df_s.at[row_index, "Column 3"] workbook_for_b.save(f"results_folder\\Sheet {j}.xlsx")
解决方法
问题核心:当row_index超出有效范围后,i循环未终止,且location_value等变量仍保留着上一次的旧数据,导致无效填充。
修改方案:在i循环内,先判断row_index是否超出范围,若超出则直接跳出i循环,停止当前工作表的列填充操作;同时在超出范围时清空变量值,避免旧数据残留。
修改后的代码:
row_index = 0 # 初始化变量时增加索引判断,避免启动时越界 if row_index < row_count_b: location_value = df_s.at[row_index, "Column 1"] sample_no_value = df_s.at[row_index, "Column 2"] top_depth_value = df_s.at[row_index, "Column 3"] else: location_value = sample_no_value = top_depth_value = None # Iterate over the rows of df_s for j in range(1, no_of_sheet_b + 1, 1): for i in range(10, 31, 4): # 行索引超出范围时,直接终止列填充循环 if row_index >= row_count_b: break # 填充当前列数据 worksheet_for_b.cell(row=9, column=i).value = location_value worksheet_for_b.cell(row=12, column=i).value = sample_no_value worksheet_for_b.cell(row=15, column=i).value = top_depth_value worksheet_for_b.cell(row=7, column=4, value=f'{date_assigned}') worksheet_for_b.cell(row=7, column=12, value=f'{project_name}') worksheet_for_b.cell(row=7, column=24, value=f'{job_no}') # 切换到下一行 row_index += 1 if row_index < row_count_b: location_value = df_s.at[row_index, "Column 1"] sample_no_value = df_s.at[row_index, "Column 2"] top_depth_value = df_s.at[row_index, "Column 3"] else: # 超出范围后清空变量,防止意外填充 location_value = sample_no_value = top_depth_value = None workbook_for_b.save(f"results_folder\\Sheet {j}.xlsx")
关键改动说明
- 在
i循环开头增加终止判断:一旦row_index >= row_count_b,立即跳出列填充循环,不再处理后续列。 - 增加索引越界时的变量清空逻辑,确保即使有意外循环执行,也不会用旧数据填充空列。
- 初始化变量时增加索引判断,避免程序启动时触发索引越界错误。
内容的提问来源于stack exchange,提问作者S P
相关产品推荐
相关产品推荐

