You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:22:51