使用xlrd遍历.xls文件获取指定单元格右侧值遇IndexError问题
问题分析与修复
核心问题点
- 全局工作表复用错误:代码开头只打开了
1.xls,后续遍历所有xls文件时,find_parts函数始终用的是这个固定工作表,根本没处理传入的目标文件,等于白遍历其他文件。 - 条件判断逻辑错误:
if cell.value == "part number" or "Part Number" or "PART NUMBER"这行完全写错了,Python里这种写法会被解析为(cell.value == "part number") or ("Part Number") or ("PART NUMBER"),而非空字符串永远为真,所以不管单元格内容是什么,这个条件都会成立,导致遍历每个单元格时都尝试访问右侧列,最后一列自然就越界报错。 - 未做边界检查:就算找到目标单元格,也没判断右侧是否存在有效列,直接访问
colidx+1必然会在最后一列触发索引越界。 - 提前返回导致漏结果:函数里用了
return,找到第一个匹配项就直接返回了,没法输出所有符合条件的单元格右侧值。
修复后的代码
import xlrd import os def find_parts(file_path): try: wb = xlrd.open_workbook(file_path) ws = wb.sheet_by_index(0) results = [] for rowidx in range(ws.nrows): row = ws.row(rowidx) for colidx, cell in enumerate(row): # 统一转小写判断,覆盖所有大小写变体 cell_value = str(cell.value).strip().lower() if cell_value == "part number": # 检查右侧列是否存在,避免索引越界 if colidx + 1 < ws.ncols: right_value = ws.cell(rowidx, colidx+1).value results.append(f"文件{file_path} 行{rowidx+1}:{right_value}") else: results.append(f"文件{file_path} 行{rowidx+1}:目标单元格右侧无内容") return results except Exception as e: return [f"文件{file_path}处理出错:{str(e)}"] # 遍历目标文件夹下所有xls文件 target_dir = r"C:\Users\sdiaz\Desktop\Active" for root, _, files in os.walk(target_dir): for file in files: if file.endswith('.xls'): full_path = os.path.join(root, file) results = find_parts(full_path) for res in results: print(res)
修复说明
- 每个文件单独处理:
find_parts函数接收文件完整路径,每次都打开对应的工作簿和工作表,不再复用全局的固定工作表。 - 简洁的大小写匹配:把单元格内容转成小写后和
"part number"比较,一次性覆盖所有大小写变体,写法更高效。 - 索引边界检查:访问右侧列前先判断
colidx+1 < ws.ncols,彻底避免索引越界异常。 - 收集所有匹配结果:用列表存储所有符合条件的结果,遍历完整个工作表后再返回,不会提前终止导致漏输出。
- 异常捕获:增加
try-except捕获文件读写时的异常,避免单个文件出错导致整个程序崩溃。
内容的提问来源于stack exchange,提问作者Sandro
相关产品推荐
相关产品推荐

