Python读取CSV解析JSON字符串报JSONDecodeError问题排查
报错原因
- 你存储的
raw_tweet字段内容不是标准JSON格式,是Python字典的字符串打印结果:使用单引号包裹字符串、用None/True/False表示空值和布尔值,不符合JSON规范(要求双引号、null/true/false)。 - 你采用的全局字符串替换逻辑存在严重缺陷:全局替换单引号为双引号会误替换文本内容中本身存在的单引号(例如推文中的
y'all、what's等缩写),全局替换None为空字符串既会丢失空值语义,也可能误匹配正文里的"None"文本,同时你没有处理布尔值True/False的转换,必然导致格式错误。 - 你提供的CSV样例本身存在格式损坏:第二条数据的结尾和第三条数据的开头直接拼接,缺失换行符,会导致CSV解析器把两行识别为一条错误数据。
raw_tweet内的文本字段存在双重双引号转义(例如""text content""),简单字符串替换无法正确处理这类嵌套转义场景,极易破坏结构。
正确实现方案
不要手动编写字符串替换逻辑,直接使用Python标准库ast的literal_eval方法,该方法可以安全、准确地解析Python原生字面量(包括字典、列表、字符串、空值、布尔值等),自动处理所有引号转义、特殊值问题,是处理这类场景的最优方案。
标准csv库读取实现
首先先手动修复源CSV文件的格式错误:找到第二条数据末尾}"和第三条数据开头2017_Q4_280的拼接位置,在中间添加换行符,拆分为独立的两行。
之后使用如下代码读取解析:
import csv import ast with open('testfile.csv', 'r', encoding='utf-8', newline='') as csvfile: reader = csv.DictReader(csvfile) for row in reader: # 直接解析Python字典字符串,无需额外替换处理 tweet = ast.literal_eval(row['raw_tweet']) # 按需读取字段,例如读取推文文本、发布时间 print(f"推文ID:{row['key']},正文:{tweet['text']}")
pandas读取实现
如果使用pandas处理,同样基于ast.literal_eval解析即可:
import pandas as pd import ast df = pd.read_csv('testfile.csv', encoding='utf-8') # 批量解析raw_tweet列为字典对象 df['tweet'] = df['raw_tweet'].apply(ast.literal_eval) # 提取需要的字段,例如提取推文文本、点赞数 df['text'] = df['tweet'].apply(lambda x: x['text']) df['like_count'] = df['tweet'].apply(lambda x: x['favorite_count'])
注意事项
- 不建议强行把字符串修改为JSON格式再用
json.loads解析,需要处理的转义场景极多,稳定性远低于ast.literal_eval。 ast.literal_eval是安全方法,不会执行字符串中的恶意代码,可放心用于外部输入数据的解析。
内容的提问来源于stack exchange,提问作者Wolf Walker
相关产品推荐
相关产品推荐

