Python读取HDFS拉取的多行JSON文本文件时遭遇JSONDecodeError的正确解决方法
解决JSONDecodeError并正确加载HDFS拉取的文本文件
这个JSONDecodeError的问题很常见,咱们一步步拆解原因并解决它:
首先,报错提示Expecting value: line 2 column 1 (char 1),说明程序尝试解析第二行时,发现该行没有有效的JSON值——大概率是文件里存在空行/空白行(比如多余的换行符、全是空格的行),也可能是某行的JSON格式本身不合法。
1. 先处理无效行,跳过空内容
遍历文件行时,先对每行做预处理:去掉首尾空白字符,如果处理后是空字符串,直接跳过该行,避免传给json.loads解析空内容。
2. 增加异常捕获,避免程序崩溃
即使跳过了空行,也可能存在格式错误的JSON行,加上try-except块可以捕获解析失败的行,还能记录错误信息方便排查问题。
3. 确认原始JSON格式合法性
你提供的示例里用了someInt、someString作为占位符,要确保实际拉取的文件满足JSON规范:
- 数字类型不能加引号(比如
"timestamp": 1690000000而非"timestamp": "1690000000") - 字符串必须用双引号包裹(比如
"videoId": "video_123"而非"videoId": video_123) - 数组、对象的括号要配对完整
修改后的可运行代码
import json import csv wanted_data = [] with open('file.txt', 'r') as f: for line_num, line in enumerate(f, start=1): # 清理行首尾空白,跳过空行 cleaned_line = line.strip() if not cleaned_line: print(f"跳过空行:第{line_num}行") continue try: json_data = json.loads(cleaned_line) except json.JSONDecodeError as e: print(f"解析失败:第{line_num}行,错误信息:{e}") continue # 提取目标数据 wanted_data.append(json_data['videoId']) # 遍历scores数组(替代固定range(6),避免数组长度不足报错) for score in json_data['scores']: wanted_data.append(score['bucket']) wanted_data.append(score['value']) # 写入CSV文件,newline=''避免Windows下出现多余空行 with open('file.csv', 'w+', newline='') as f_out: write = csv.writer(f_out) write.writerow(wanted_data)
额外优化说明
- 把
range(6)改成直接遍历json_data['scores'],避免因某行scores数组长度不是6而引发索引错误,兼容性更强。 - 写入CSV时添加
newline='',解决Windows系统下写入后自动换行的问题。
内容的提问来源于stack exchange,提问作者JYosen
相关产品推荐
相关产品推荐

