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

从JSONL文件提取text字段至TXT时遇JSONDecodeError的解决咨询

解决JSONL文件解析的JSONDecodeError并提取text字段

这个错误的根源很明确:你用了错误的方式处理JSONL格式的文件。JSONL是每行一个独立的JSON对象,而json.load()是用来加载完整的单个JSON文档(比如一个数组或者单个对象)——当它读完第一行的JSON后,第二行的内容就被当成了"多余数据",自然就报错了。

修正后的代码

直接上可以运行的解决方案,同时处理了空行和异常情况:

import json

# 用'w'模式会覆盖原有内容,若需要追加可以换成'a+'
with open('webtext.txt', 'w', encoding='utf-8') as output_file, \
     open('output-dataset_v1_webtext.test.jsonl', 'r', encoding='utf-8') as jsonl_file:
    
    for line_num, line in enumerate(jsonl_file, 1):
        # 移除首尾空白字符,跳过空行
        cleaned_line = line.strip()
        if not cleaned_line:
            continue
        
        try:
            # 逐行解析JSON对象
            item = json.loads(cleaned_line)
            # 提取text字段并写入,添加换行符保证每行一个文本内容
            output_file.write(f"{item['text']}\n")
            print(f"已处理第{line_num}行: {item['text']}")
        except json.JSONDecodeError as e:
            print(f"第{line_num}行解析失败: {e},内容为: {cleaned_line}")
        except KeyError:
            print(f"第{line_num}行缺少'text'字段: {cleaned_line}")

关键说明

  • 逐行解析:JSONL的核心就是每行一个JSON,必须用json.loads()单独处理每一行,而不是用json.load()加载整个文件。
  • 文件操作优化:用with语句同时打开两个文件,会自动帮你处理文件关闭,避免资源泄漏。
  • 健壮性提升:加入了行号追踪、空行跳过、异常捕获(解析错误和字段缺失),让程序遇到小问题不会直接崩溃,还能告诉你哪里出了问题。
  • 编码处理:指定encoding='utf-8'避免不同环境下的编码问题。

为什么原来的方法不行?

  • 你最初用json.load(json_file),会把整个文件内容当作一个JSON文档解析,但你的文件是多个独立的JSON对象,不是用逗号分隔的数组,所以读到第二行就会报错。
  • 即使换成json.loads(),如果直接读取整个文件的内容(比如json.loads(json_file.read())),同样会因为多个独立JSON对象存在而触发"Extra data"错误,必须逐行处理才是正确姿势。

内容的提问来源于stack exchange,提问作者Faisal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:40:32