Python解析Yelp大JSON文件时每次执行返回不同行的问题排查
Yelp大JSON数据集解析问题排查与解决
问题根源
你遇到的索引越界、同一行解析结果不一致,大概率是以下两个原因:
- JSON格式与逐行读取逻辑不匹配:Yelp数据集有两种常见格式——一种是每行一个独立JSON对象(JSON Lines),另一种是整个文件为一个大JSON数组。如果是大数组格式,直接逐行读取会拿到不完整的JSON片段(比如带逗号的行、开头的
[或结尾的]),解析时出错导致内容混乱。 - 解析函数逻辑错误:如果你的函数里用了手动拆分字符串(比如按逗号分割)的操作,JSON对象内部的字符串字段可能包含逗号,这种拆分会彻底破坏结构,导致每次解析结果随机出错。
解决步骤
1. 先确认数据集格式
打开JSON文件查看前几行:
- 如果第一行是
{,每行都是完整JSON对象,属于JSON Lines格式,处理最简单。 - 如果第一行是
[,后续行是{...},,最后一行是{...}],属于大数组格式,需要处理分隔符。
2. 对应格式的正确解析代码
JSON Lines格式(推荐)
import json import pandas as pd def json_parser(file_path, sample_size=1000): data = [] with open(file_path, 'r', encoding='utf-8') as f: for idx, line in enumerate(f): if idx >= sample_size: break line = line.strip() if not line: continue try: data.append(json.loads(line)) except json.JSONDecodeError as err: print(f"第{idx+1}行解析失败: {err}") continue return pd.DataFrame(data) # 调用示例,取500条样本 sample_df = json_parser('yelp_data.json', sample_size=500)
大JSON数组格式
import json import pandas as pd def json_parser(file_path, sample_size=1000): data = [] with open(file_path, 'r', encoding='utf-8') as f: # 跳过开头的[ first_line = f.readline().strip() if first_line != '[': f.seek(0) # 不是数组格式,回到文件开头重新读 for idx, line in enumerate(f): if idx >= sample_size + 1: # 加1是因为跳过了第一行的[ break line = line.strip() if not line or line == '[': continue # 去掉行尾的逗号或最后一行的] if line.endswith(','): line = line[:-1] elif line.endswith(']'): line = line[:-1].strip() if not line: continue try: data.append(json.loads(line)) except json.JSONDecodeError as err: print(f"第{idx+1}行解析失败: {err}") continue return pd.DataFrame(data)
3. 排查索引越界的细节
- 删掉所有手动拆分JSON字符串的代码(比如
split(',')),必须用json.loads()解析完整JSON对象。 - 读取文件时指定编码
utf-8,避免乱码导致解析结果随机错误。 - 确保每次读取文件都用
with语句自动关闭,避免文件指针残留导致读取位置错误。
内容的提问来源于stack exchange,提问作者milikest
相关产品推荐
相关产品推荐

