Python脚本无限循环故障排查:PDF数据分组代码求助
解决Python字典分组代码的无限循环问题
我是编程纯新手,仅在Codecademy学习过Python课程。目前为所在公司编写一款可生成可填写PDF表单的小脚本,后续还需将表单数据导入matplotlib进行分析。我已完成PDF表单生成的基础部分,正在编写用于提取PDF数据的脚本,但其中这段分组键值对的代码陷入了无限循环,我无法理解原因,恳请各位提供帮助!
补充说明:
data是从PDF表单中提取的包含特定键值对的字典,我正尝试通过下述代码对其中的键进行分组。
原代码:
switch = 1 ends_counter = 1 extracted_calibre_data = {} extracted_calibre_data_subdict = {} while switch != 0: extracted_calibre_test = extracted_calibre_data.copy() for key in data: letter_check = ["e", "c"] if key[0] == letter_check[0]: if key[1] == str(ends_counter): if key[2] == letter_check[1]: extracted_calibre_data_subdict[key[3]+key[4]] = data[key] else: continue else: continue else: continue extracted_calibre_data[ends_counter] = extracted_calibre_data_subdict ends_counter = ends_counter + 1 if extracted_calibre_test == extracted_calibre_data: switch = 0 else: continue
核心问题分析
- 循环退出逻辑完全失效:
switch的赋值仅在找到符合条件的键时才会触发判断。如果某次while循环遍历data时没有匹配ends_counter的键,就不会执行退出判断,switch始终为1,直接导致无限循环。 - 子字典未重置:
extracted_calibre_data_subdict是全局变量,每次循环不会清空,导致后续分组会包含之前所有分组的数据,同时重复赋值给extracted_calibre_data的不同键。 - 计数器递增时机错误:
每次找到一个符合条件的键就递增ends_counter,而非处理完同一组(同一ends_counter值)的所有键后再递增,分组逻辑完全混乱。
修复后的代码
我们简化逻辑,直接遍历所有键按规则归类,彻底避免冗余的while循环:
extracted_calibre_data = {} letter_check = ["e", "c"] for key in data: # 跳过格式不符合要求的键 if len(key) < 5: continue if key[0] != letter_check[0] or key[2] != letter_check[1]: continue # 转换分组编号为整数,跳过无效格式 try: group_num = int(key[1]) except ValueError: continue # 生成子字典的键 sub_key = key[3] + key[4] # 自动创建新分组(如果不存在) if group_num not in extracted_calibre_data: extracted_calibre_data[group_num] = {} # 添加键值对到对应分组 extracted_calibre_data[group_num][sub_key] = data[key]
修复方案优势
- 去掉冗余的循环控制变量,一次遍历完成分组,逻辑清晰易维护。
- 每个分组自动创建独立子字典,避免旧数据残留。
- 增加格式校验和异常处理,避免因键格式错误导致崩溃。
内容的提问来源于stack exchange,提问作者user23337460
相关产品推荐
相关产品推荐

