Python遍历文件时用len(text.readlines())引发ZeroDivisionError的原因
问题分析与解决:文件遍历中的除零错误
问题背景
需求是读取文本文件所有数据,遍历到第50行或最后一行时点击按钮并进入下一个函数。目标文件仅有44行,但运行代码时触发了如下错误:
ZeroDivisionError: integer division or modulo by zero
原代码
with open(r'D:\Workstuff\my-work-python-script\Auto_Tracker (dev)\retrieve_tracking.txt', 'r+') as text: #fetch all value for index, value in enumerate(text): if index % 49 == 0 and index != 0: driver.find_element(By.ID,'trackItNowForm:searchSkuBtn').click() elif index % len(text.readlines()) == 0 and index != 0: driver.find_element(By.ID,'trackItNowForm:searchSkuBtn').click()
排查过程
尝试打印相关值:
for index, value in enumerate(text): #iterate through all of them first print(f'Total Line :{len(text.readlines())}') print(f'Index = {index}')
输出结果为:
Total Line : 44 Index = 0
明明文件长度不为0,却触发了除零错误。
问题原因
核心问题出在文件对象的迭代器特性:
- 文件对象是一次性迭代器,调用
text.readlines()时,会把文件指针移动到文件末尾,一次性读取所有行。 - 第一次循环(index=0)调用
len(text.readlines())得到44,但此时文件指针已经到了末尾;第二次循环(index=1)再调用text.readlines()时,会返回空列表,长度为0,导致index % 0触发除零错误。 - 另外原代码的逻辑还有两个错误:
index % 49 ==0的判断不符合需求——index从0开始,第50行对应的index是49,而该条件会在index=49、98等行触发,不是仅第50行。index % len(text.readlines()) ==0的逻辑错误:比如文件共44行,最后一行的index是43,43%44不等于0,根本不会触发点击,不符合“最后一行点击”的需求。
修正方案
提前将所有行读取到内存列表中,避免迭代器指针移动的问题,同时修正判断逻辑:
with open(r'D:\Workstuff\my-work-python-script\Auto_Tracker (dev)\retrieve_tracking.txt', 'r+') as text: # 一次性读取所有行到列表,后续可重复使用 lines = text.readlines() total_lines = len(lines) for index, value in enumerate(lines): # 判断是否是第50行(index=49)或最后一行(index=总长度-1) if index == 49 or index == total_lines - 1: driver.find_element(By.ID,'trackItNowForm:searchSkuBtn').click() # 在这里添加进入下一个函数的逻辑
修正说明
- 提前读取所有行到
lines列表,total_lines只计算一次,避免重复调用readlines()导致的指针问题。 - 直接判断index值,精准匹配第50行和最后一行的触发条件,逻辑更清晰准确。
内容的提问来源于stack exchange,提问作者Jirayuth Porka
相关产品推荐
相关产品推荐

