You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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")

关键改动说明

  1. 在i循环开头增加终止判断:一旦row_index >= row_count_b,立即跳出列填充循环,不再处理后续列。
  2. 增加索引越界时的变量清空逻辑,确保即使有意外循环执行,也不会用旧数据填充空列。
  3. 初始化变量时增加索引判断,避免程序启动时触发索引越界错误。

内容的提问来源于stack exchange,提问作者S P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:12:57