从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
相关产品推荐
相关产品推荐

