DataFrame中字典格式字符串转字典报错,如何修复并直接读取?
解决方案
一、修复JSONDecodeError:用ast.literal_eval()替代json.loads()
直接替换单引号为双引号会破坏字符串内部的单引号内容(比如"don't"会被错误转为"don"t"),导致JSON格式非法。Python标准库的ast.literal_eval()可以安全解析符合Python语法的字面量(包括带单引号的字典、列表),完美适配这类场景:
import ast import pandas as pd # 读取文件后转换目标列 df = pd.read_csv("your_data.csv") df["answer"] = df["answer"].apply(ast.literal_eval)
注意事项:
ast.literal_eval()比eval()安全,仅解析字典、列表、字符串、数字等字面量,不会执行任意代码;- 支持解析Python特有的语法(如
None、True/False、元组),这些是json.loads()无法处理的。
二、直接读取为字典:利用读取工具的转换参数
以pandas为例,可通过converters参数在读取阶段直接将answer列解析为字典,无需后续二次转换:
import ast import pandas as pd def parse_answer(s): try: return ast.literal_eval(s) except (ValueError, SyntaxError): # 处理解析失败的异常,可返回空字典或原字符串 return {} # 读取时直接转换目标列 df = pd.read_csv("your_data.csv", converters={"answer": parse_answer})
如果使用原生csv模块读取,也可以在遍历行数据时对目标列做实时转换:
import ast import csv with open("your_data.csv", "r", encoding="utf-8") as f: reader = csv.DictReader(f) for row in reader: row["answer"] = ast.literal_eval(row["answer"]) # 处理该行数据
内容的提问来源于stack exchange,提问作者Advaita Mallik
相关产品推荐
相关产品推荐

