使用ast.literal_eval去除字符串外层单引号触发ValueError求助
问题分析与解决
错误原因
你遇到的ValueError是因为ast.literal_eval仅支持解析符合Python语法规范的字面量,而你的字符串里使用了JSON风格的小写布尔值false/true——在Python中,布尔值必须是大写开头的False/True,小写的false会被ast.literal_eval识别为未定义的变量名,从而触发解析错误。
解决方案
方案1:直接输出字符串(仅去除外层单引号)
如果你的需求只是去掉字符串外层的单引号,直接打印变量即可,无需解析:
a = '[{"M":{"Options":{"L":[{"M":{"Label":{"S":"5PCS "},"Selected":{"BOOL":false},"OptionId":{"S":"3080a2b2-2fd1-11ed-a261-0242ac120002"},"Price":{"N":"0"}}},{"M":{"Label":{"S":"8PCS"},"Selected":{"BOOL":false},"OptionId":{"S":"27f2148c-2fd1-11ed-a261-0242ac120002"},"Price":{"N":"600"}}}]},"Type":{"S":"multiple"},"Description":{"S":"PCS "},"Required":{"BOOL":true},"Max":{"S":"1"},"Index":{"N":"0"},"Remove":{"BOOL":false},"Selected":{"N":"0"}}}]' print(a)
执行后会直接输出你期望的无外层单引号的字符串内容。
方案2:解析为Python对象
如果需要将字符串解析为可操作的Python对象,由于你的内容是标准JSON格式(双引号键、小写布尔值),应该使用json模块而非ast.literal_eval:
import json a = '[{"M":{"Options":{"L":[{"M":{"Label":{"S":"5PCS "},"Selected":{"BOOL":false},"OptionId":{"S":"3080a2b2-2fd1-11ed-a261-0242ac120002"},"Price":{"N":"0"}}},{"M":{"Label":{"S":"8PCS"},"Selected":{"BOOL":false},"OptionId":{"S":"27f2148c-2fd1-11ed-a261-0242ac120002"},"Price":{"N":"600"}}}]},"Type":{"S":"multiple"},"Description":{"S":"PCS "},"Required":{"BOOL":true},"Max":{"S":"1"},"Index":{"N":"0"},"Remove":{"BOOL":false},"Selected":{"N":"0"}}}]' parsed_data = json.loads(a) # 若要输出格式化后的字符串,可使用json.dumps print(json.dumps(parsed_data, indent=2))
这个方法会将字符串解析为Python列表/字典,同时保留所有原始数据结构。
内容的提问来源于stack exchange,提问作者Jesse Jin
相关产品推荐
相关产品推荐

