ast.literal_eval处理游戏数据触发ValueError malformed node报错咨询
ast.literal_eval 报错原因与修复方案
核心原因
ast.literal_eval仅支持解析Python原生字面量(字符串、数字、列表、字典、元组、布尔值、None、字节串),只要待解析内容中出现未被引号包裹的标识符(比如变量名、自定义常量名、JSON风格的关键字),就会被识别为ast.Name节点,触发malformed node or string报错,本次报错不属于bytes转str解码异常。- 最常见的触发场景是游戏返回的是类JSON结构而非Python字面量:JSON标准里的
true/false/null对应Python的True/False/None,这些小写的未加引号关键字会被ast判定为非法Name节点,直接解析就会报错。
修复方案
- 优先使用
json模块解析:如果游戏返回数据是标准JSON格式,直接调用json.loads()处理即可自动完成关键字类型转换,不需要用到ast.literal_eval。 - 必须使用
ast.literal_eval的场景,先对原始字符串做关键字替换:
import ast def parse_game_data(raw_str): processed_str = raw_str.replace("true", "True")\ .replace("false", "False")\ .replace("null", "None") return ast.literal_eval(processed_str)
- 若替换后仍报错,可打印待解析的原始字符串,检查是否存在其他未被引号包裹的游戏自定义标识符,针对性做替换后再解析即可。
报错场景截图显示待解析内容中包含小写的true/false值,完全匹配上述问题特征。
内容的提问来源于stack exchange,提问作者Левый Тип
相关产品推荐
相关产品推荐

