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

遍历目录多JSON文件时for循环失效 触发UnboundLocalError报错

问题根因

代码存在三个异常的核心原因如下:

  • error_str输出空数组:文件打开模式误用w+,该模式打开文件时会直接清空原有文件内容,后续执行readlines()只能读取到空值;额外使用json.dumps()处理读取出的行列表属于冗余操作,序列化后的带转义符字符串也会干扰后续正则匹配。
  • 多文件循环仅完成1次迭代:第一个文件被w+模式清空后,无法匹配到目标关键字,直接触发未赋值变量引用的报错,程序中断运行,无法遍历剩余文件。
  • 抛出UnboundLocalError异常:final_error_code的赋值逻辑写在正则匹配的内层循环中,当文件无匹配内容时内层循环不执行,变量从未被初始化,循环结束后执行打印、返回操作时就会触发未定义引用错误。
修复方案

针对以上问题做三点调整:

  1. 将文件打开模式从w+改为r只读模式,避免修改、清空原文件,指定文件编码避免乱码
  2. 在函数入口提前初始化final_error_code为空列表,给变量默认值,从根源避免未定义引用问题
  3. 移除冗余的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:45:31