jsonl写入需逐行序列化:对每个对象调用json.dumps(obj, ensure_ascii=false)后显式写入"\n",禁用json.dump()整体写入;须指定utf-8编码、统一使用\n换行、避免末行空行,并通过jq或逐行json.loads校验合法性。

JSONL写入的核心是逐行序列化,不是一次性 dump
直接用 json.dump() 写整个列表会生成标准 JSON(带方括号、逗号分隔),不符合 JSONL 要求。JSONL 的本质是:每行一个独立、合法的 JSON 对象,行间无逗号、无包裹数组。必须对每个对象单独调用 json.dumps(),再手动换行。
用 json.dumps() + file.write() 逐行写入最稳妥
避免使用 json.dump() 或写入后字符串替换,容易引入格式错误(如末尾多逗号、缩进残留)。关键点:
-
json.dumps(obj, ensure_ascii=False)保留中文等非 ASCII 字符(默认为True,会转义成\uXXXX) - 每行结尾必须显式加
\n,Windows 下不用\r\n—— JSONL 规范只认\n - 不要在最后一行额外写空行,部分解析器(如
jq)会报错
import json
data_list = [{"id": 1, "name": "Alice"}, {"id": 2, "name": "Bob"}]
with open("output.jsonl", "w", encoding="utf-8") as f:
for obj in data_list:
f.write(json.dumps(obj, ensure_ascii=False))
f.write("\n")
注意文件编码和换行符一致性
常见坑:
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
- 用
"w"模式打开时没指定encoding="utf-8"→ 中文写入乱码或抛UnicodeEncodeError - 在 Windows 上用
textwrap.fill()或其他工具二次处理文件 → 可能插入\r\n,破坏 JSONL 单行结构 - 用
pathlib.Path.write_text()一次写入全部内容 → 容易误把整个列表当单个对象序列化
验证是否真为合法 JSONL
写完别急着读,先快速校验:
- 用命令行
head -n 2 output.jsonl看前两行是否各自是完整 JSON(如{"id": 1, "name": "Alice"}) - 用
jq -s '.' output.jsonl尝试加载 —— 成功说明每行可独立解析;失败则某行有语法错误(比如字段值漏引号、尾部多逗号) - Python 中可用
json.loads(line.strip())循环校验每一行,遇到JSONDecodeError就定位到具体行号
JSONL 看似简单,但“每行一个对象”这个约束在流式写入、异常中断、编码混用时极容易破防,尤其是跨平台协作时,换行符和编码必须从第一行就对齐。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










