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

如何将文档扫描代码的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)

问题原因分析

  1. 循环条件错误:文档页码索引从0开始,总页数为len(document)时,最大有效索引是len(document)-1。原while循环条件page_num <= len(document)会导致最后一次循环访问document[len(document)]触发索引越界,同时也会让循环多执行一次,加重卡住概率。
  2. 页码递增逻辑漏洞:
    • 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:55:15