遍历目录多JSON文件时for循环失效 触发UnboundLocalError报错
问题根因
代码存在三个异常的核心原因如下:
error_str输出空数组:文件打开模式误用w+,该模式打开文件时会直接清空原有文件内容,后续执行readlines()只能读取到空值;额外使用json.dumps()处理读取出的行列表属于冗余操作,序列化后的带转义符字符串也会干扰后续正则匹配。- 多文件循环仅完成1次迭代:第一个文件被
w+模式清空后,无法匹配到目标关键字,直接触发未赋值变量引用的报错,程序中断运行,无法遍历剩余文件。 - 抛出
UnboundLocalError异常:final_error_code的赋值逻辑写在正则匹配的内层循环中,当文件无匹配内容时内层循环不执行,变量从未被初始化,循环结束后执行打印、返回操作时就会触发未定义引用错误。
修复方案
针对以上问题做三点调整:
- 将文件打开模式从
w+改为r只读模式,避免修改、清空原文件,指定文件编码避免乱码 - 在函数入口提前初始化
final_error_code为空列表,给变量默认值,从根源避免未定义引用问题 - 移除冗余的
json.dumps操作,直接拼接文件原始内容做正则匹配;将错误码列表的生成逻辑移到所有循环结束后统一执行,避免循环内重复赋值的冗余计算,同时增加索引边界判断避免越界报错
修复后可直接运行的代码如下:
import json import re import os # 替换为你的JSON文件所在目录实际路径 target_json_dir = "./your_json_file_path" # 过滤目录下所有JSON格式文件生成遍历列表 list_of_files = [ os.path.join(target_json_dir, filename) for filename in os.listdir(target_json_dir) if filename.endswith(".json") ] def get_error_code_array(): pt_failed_suffix = [] # 提前初始化结果变量,设置默认空值 final_error_code = [] for file_path in list_of_files: # 只读模式打开文件,保留原文件内容 with open(file_path, 'r', encoding='utf-8') as file: lines = file.readlines() print(f"读取文件[{file_path}]原始行内容:", lines) # 拼接行内容为原始文本,替代冗余的json.dumps逻辑 file_content = ''.join(lines) print("文件拼接后完整内容:", file_content) # 正则匹配所有PT-前缀的错误码 for match_res in re.finditer(r'PT-', file_content): suffix_start = match_res.end() # 增加边界判断,避免文本长度不足时触发索引越界 if suffix_start + 2 < len(file_content): # 取PT-后3位字符作为错误码后缀 current_suffix = file_content[suffix_start] + file_content[suffix_start+1] + file_content[suffix_start+2] pt_failed_suffix.append(current_suffix) # 所有文件遍历完成后统一拼接生成最终错误码列表 final_error_code = [f"PT-{suffix}" for suffix in pt_failed_suffix] print("Lemon Squeeze", final_error_code) return final_error_code answer = get_error_code_array() print("最终提取的错误码列表:", answer)
内容的提问来源于stack exchange,提问作者uds
相关产品推荐
相关产品推荐

