在Python(JupyterLab)中读取亚马逊JSON评论并提取字段遇报错
问题解决:处理JSON Lines格式的亚马逊评论数据
错误原因
- JSON格式不匹配:你的文件是JSON Lines格式(每行一个独立的JSON对象),但
json.load()要求读取的是单个合法JSON结构(比如完整数组或单个对象),解析完第一行后还有后续内容,所以抛出JSONDecodeError。 - 代码逻辑错误:
- 键名拼写错误:
overal应为overall - 即使加载成功,
data也不会是嵌套结构,不能用data['reviewText']['overall']['summary']这种方式取值
- 键名拼写错误:
正确解决方案
方案一:逐行解析(推荐处理大文件)
逐行读取并解析每个JSON对象,避免一次性加载大量数据占用内存:
import json # 存储提取后的结果 extracted_reviews = [] with open('Amazon_Instant_Video_5.json', 'r', encoding='utf-8') as json_file: for line in json_file: # 跳过空行 cleaned_line = line.strip() if not cleaned_line: continue # 解析单行JSON review_obj = json.loads(cleaned_line) # 提取目标字段 extracted = { 'reviewText': review_obj['reviewText'], 'overall': review_obj['overall'], 'summary': review_obj['summary'] } extracted_reviews.append(extracted) # 验证前3条结果 for idx, review in enumerate(extracted_reviews[:3], 1): print(f"第{idx}条评论:") print(review) print("---")
方案二:转换为JSON数组后解析
如果需要一次性加载所有数据,可以先将文件内容转换为合法的JSON数组:
import json with open('Amazon_Instant_Video_5.json', 'r', encoding='utf-8') as json_file: # 读取所有非空行 valid_lines = [line.strip() for line in json_file if line.strip()] # 拼接成JSON数组格式 json_array_str = f"[{','.join(valid_lines)}]" # 解析整个数组 all_reviews = json.loads(json_array_str) # 批量提取字段 extracted_reviews = [ { 'reviewText': item['reviewText'], 'overall': item['overall'], 'summary': item['summary'] } for item in all_reviews ] # 输出第一条结果示例 print(extracted_reviews[0])
注意事项
- 处理数千条评论时,优先选择逐行解析的方式,降低内存消耗。
- 确保字段名拼写准确,比如
overall不要写成overal。
内容的提问来源于stack exchange,提问作者Anano Mikadze
相关产品推荐
相关产品推荐

