如何将文档扫描代码的for循环转为while循环并解决死循环
文档扫描循环转换问题:for转while后触发无限循环
我尝试将文档扫描功能中的for循环转换为while循环,但每次转换后程序都会陷入无限循环。原for循环可正常识别表单页眉、结束文本并记录表单起止页码,我认为通过索引迭代的while循环应能实现相同效果。以下是原for循环代码及存在问题的while循环代码,求解决思路。
原for循环代码
from fuzzywuzzy import fuzz import time import fitz from date_check import locate_date ## Each header is a list containing the header text and the form name ## headers = ["header1", "Header1"] ## cast to lowercase ## for header in headers: header[0] = header[0].lower() ## One of the following is expected to be on the last page of the form ## end_texts = ["Signature", "Signed"] ## cast to lowercase ## for i in range(len(end_texts)): end_texts[i] = end_texts[i].lower() ## set variables ## forms = [] first_page = 0 header = "" ## Scan entire document for headers ## def scan_document(document): document = fitz.open(document) first_page = False last_page = False index = 0 ## This is the loop in question ## for i in range(len(document)): page = document[i] text = page.get_text("text") text = text.lower() if first_page == False: for header in headers: if fuzz.partial_ratio(header[0], text) > 90: first_page = i ## Find the date on the page ## date = locate_date(text) forms.append([date, header[1], first_page]) break elif first_page != False and last_page == False: for end_text in end_texts: if end_text in text: last_page = i forms[index].append(last_page) first_page = False last_page = False index += 1 break ## Return forms list containing first and last page of each form as well as the header ## return(forms)
存在问题的while循环代码(运行后程序挂起)
## set variables ## forms = [] first_page = 0 header = "" ## Scan entire document for headers ## def scan_document(document): document = fitz.open(document) first_page = False last_page = False page_num = 0 index = 0 while page_num <= len(document): page = document[page_num] text = page.get_text("text") text = text.lower() if first_page == False: for header in headers: if fuzz.partial_ratio(header[0], text) > 90: first_page = page_num ## Find the date on the page ## date = locate_date(text) forms.append([date, header[1], first_page]) page_num += 1 break elif first_page != False and last_page == False: for end_text in end_texts: if end_text in text: last_page = page_num forms[index].append(last_page) first_page = False last_page = False index += 1 page_num += 1 break else: page_num += 1 ## Return forms list containing first and last page of each form as well as the header ## return(forms)
问题原因分析
- 循环条件错误:文档页码索引从0开始,总页数为
len(document)时,最大有效索引是len(document)-1。原while循环条件page_num <= len(document)会导致最后一次循环访问document[len(document)]触发索引越界,同时也会让循环多执行一次,加重卡住概率。 - 页码递增逻辑漏洞:
- 在
first_page == False分支中,仅当找到匹配页眉时才执行page_num +=1;若当前页无匹配页眉,page_num不会递增,循环永远停在当前页,触发无限循环。 - 同理,在
first_page != False and last_page == False分支中,仅找到匹配结束文本时才递增页码;若当前页无匹配结束文本,页码不变,循环卡住。
- 在
修复方案
- 修正循环条件为
page_num < len(document),确保只访问有效页码索引。 - 将
page_num +=1移到循环末尾,无论当前页是否匹配到页眉或结束文本,都强制递增页码,避免循环停滞。
修复后的while循环代码
## set variables ## forms = [] first_page = 0 header = "" ## Scan entire document for headers ## def scan_document(document): document = fitz.open(document) first_page = False last_page = False page_num = 0 index = 0 # 修正循环条件:只遍历有效页码索引 while page_num < len(document): page = document[page_num] text = page.get_text("text") text = text.lower() if first_page == False: for header in headers: if fuzz.partial_ratio(header[0], text) > 90: first_page = page_num date = locate_date(text) forms.append([date, header[1], first_page]) break elif first_page != False and last_page == False: for end_text in end_texts: if end_text in text: last_page = page_num forms[index].append(last_page) first_page = False last_page = False index += 1 break # 无论是否匹配成功,都递增页码 page_num += 1 return forms
内容的提问来源于stack exchange,提问作者Jcwscience
相关产品推荐
相关产品推荐

