<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>数据结构 on Dev TLDRLSS</title>
        <link>https://dev.tldrlss.com/zh-cn/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/</link>
        <description>Recent content in 数据结构 on Dev TLDRLSS</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Sat, 01 Aug 2026 14:05:42 +0800</lastBuildDate><atom:link href="https://dev.tldrlss.com/zh-cn/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>JSONL 格式是什么？JSONL 与 JSON 和 CSV 有什么不同？AI 模型微调为什么非用 JSONL 不可！</title>
        <link>https://dev.tldrlss.com/zh-cn/article/2026/08/jsonl-vs-json-csv-guide/</link>
        <pubDate>Sat, 01 Aug 2026 14:05:42 +0800</pubDate>
        
        <guid>https://dev.tldrlss.com/zh-cn/article/2026/08/jsonl-vs-json-csv-guide/</guid>
        <description>&lt;img src="https://dev.tldrlss.com/global-assets/images/data/jsonl-intro-cover-1.jpg" alt="Featured image of post JSONL 格式是什么？JSONL 与 JSON 和 CSV 有什么不同？AI 模型微调为什么非用 JSONL 不可！" /&gt;&lt;p&gt;大家都很熟悉 &lt;code&gt;JSON&lt;/code&gt; 和 &lt;code&gt;CSV&lt;/code&gt;，但你有没有遇到过处理几 GB 的大型 &lt;code&gt;JSON&lt;/code&gt; 文件时导致内存直接爆炸？或是用 &lt;code&gt;CSV&lt;/code&gt; 记录多层次嵌套数据时觉得转义符号超级痛苦？&lt;/p&gt;
&lt;p&gt;在现代 AI 训练与海量数据处理领域，有一个数据格式正在默默成为主流标准，那就是 &lt;strong&gt;JSONL（JSON Lines）&lt;/strong&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;JSONL 的核心价值：解决传统 JSON 无法流式读取与 CSV 无法支持嵌套结构的两大痛点！&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;什么是-jsonl一分钟搞懂一行一个-json的核心定义&#34;&gt;什么是 JSONL？一分钟搞懂“一行一个 JSON”的核心定义
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;JSONL&lt;/code&gt; 的全名是 &lt;code&gt;JSON Lines&lt;/code&gt; （有时也被称为 &lt;code&gt;NDJSON&lt;/code&gt;，即 &lt;code&gt;Newline Delimited JSON&lt;/code&gt;）。它的核心概念非常直白：&lt;strong&gt;每一行都是一个独立且完整的 JSON 对象&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;在传统的 &lt;code&gt;JSON&lt;/code&gt; 文件中，最外层通常会有一个巨大的方括号 &lt;code&gt;[]&lt;/code&gt; 将所有数据包起来，且各对象之间必须用逗号 &lt;code&gt;,&lt;/code&gt; 隔开。而 &lt;code&gt;JSONL&lt;/code&gt; 彻底摒弃了最外层的方括号与逗号，改用换行符 &lt;code&gt;\n&lt;/code&gt; 来分隔每条数据。&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://dev.tldrlss.com/global/common/data/jsonl-vs-json-csv-1.jpg&#34;width=&#34;1024&#34;height=&#34;1024&#34;srcset=&#34;https://dev.tldrlss.com/global/common/data/jsonl-vs-json-csv-1_hu_64d704071b051a58.jpg 480w, https://dev.tldrlss.com/global/common/data/jsonl-vs-json-csv-1_hu_21dfe6d4bedc9b3b.jpg 1024w&#34;loading=&#34;lazy&#34;alt=&#34;JSONL 与 JSON、CSV 数据格式比较&#34;
	
	class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;100&#34;data-flex-basis=&#34;240px&#34;
	
&gt;&lt;/p&gt;
&lt;h3 id=&#34;三大常见数据格式对照&#34;&gt;三大常见数据格式对照
&lt;/h3&gt;&lt;p&gt;为了让大家更直观理解，我们将 &lt;code&gt;JSONL&lt;/code&gt;、&lt;code&gt;JSON&lt;/code&gt; 与 &lt;code&gt;CSV&lt;/code&gt; 放在一起比较：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;数据格式&lt;/th&gt;
          &lt;th&gt;排版结构&lt;/th&gt;
          &lt;th&gt;嵌套数据支持&lt;/th&gt;
          &lt;th&gt;流式读写（Streaming）&lt;/th&gt;
          &lt;th&gt;适合场景&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;JSON&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;整份文件为单一阶层树状结构，需一次加载&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;原生支持&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;困难（需加载整份文件）&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;Web API&lt;/code&gt; 传输、配置文件&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;CSV&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;2D 平面表格，以逗号分隔字段&lt;/td&gt;
          &lt;td&gt;困难（需转义或编码）&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;原生支持&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Excel 报表、平面数据&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;JSONL&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;一行一个独立 JSON，以换行分隔&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;原生支持&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;极佳（逐行读取与追加）&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;AI 训练集、海量 &lt;code&gt;Log&lt;/code&gt; 记录&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;!--adsense--&gt;
&lt;h2 id=&#34;为什么-ai-模型训练与大数据-etl-都偏爱-jsonl&#34;&gt;为什么 AI 模型训练与大数据 ETL 都偏爱 JSONL？
&lt;/h2&gt;&lt;p&gt;近年随着 &lt;code&gt;OpenAI&lt;/code&gt;、&lt;code&gt;Anthropic&lt;/code&gt; 等大语言模型（LLM）的崛起，&lt;code&gt;JSONL&lt;/code&gt; 跃升为微调（Fine-tuning）与数据集准备的首选格式。这背后主要有两大关键优势：&lt;/p&gt;
&lt;h3 id=&#34;1-内存占用极低支持-streaming-流式处理&#34;&gt;1. 内存占用极低（支持 Streaming 流式处理）
&lt;/h3&gt;&lt;p&gt;当你的训练数据库高达 50 GB 时，如果是传统 &lt;code&gt;JSON&lt;/code&gt; 文件，程序必须把整份 50 GB 的文件完整读入内存解析语法树，这会瞬间触发内存溢出（OOM）。&lt;/p&gt;
&lt;p&gt;而 &lt;code&gt;JSONL&lt;/code&gt; 支持 &lt;strong&gt;逐行读取（Line-by-line Streaming）&lt;/strong&gt;。程序只需要一次读取一行（可能只有几 KB），处理完毕后释放内存再读下一行。&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart TD
    subgraph TraditionalJSON[&amp;#34;传统 JSON 读取方式&amp;#34;]
        A1[&amp;#34;读取 50 GB JSON 文件&amp;#34;] --&amp;gt; A2[&amp;#34;解析全文件语法树&amp;#34;]
        A2 --&amp;gt; A3[&amp;#34;内存一次性加载 50 GB&amp;#34;]
        A3 --&amp;gt;|高风险| A4[&amp;#34;内存溢出崩溃 (OOM)&amp;#34;]
    end

    subgraph JSONLStreaming[&amp;#34;JSONL 流式读取方式&amp;#34;]
        B1[&amp;#34;开启 50 GB JSONL 文件&amp;#34;] --&amp;gt; B2[&amp;#34;读取第 1 行 (5 KB)&amp;#34;]
        B2 --&amp;gt; B3[&amp;#34;解析并处理单条数据&amp;#34;]
        B3 --&amp;gt; B4[&amp;#34;释放内存并读取下一行&amp;#34;]
        B4 --&amp;gt; B5[&amp;#34;稳定高效完成海量数据处理&amp;#34;]
    end
&lt;/pre&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;对于海量数据而言，JSONL 让内存消耗从 O(N) 降为 O(1)！&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;2-支持无锁追加append-only-logging&#34;&gt;2. 支持无锁追加（Append-Only Logging）
&lt;/h3&gt;&lt;p&gt;在分布式系统或日志收集场景中，如果要在文件末尾新增数据：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;传统 &lt;code&gt;JSON&lt;/code&gt;：必须读取全档、移除结尾的 &lt;code&gt;]&lt;/code&gt;、补上逗号 &lt;code&gt;,&lt;/code&gt;、写入新数据再补回 &lt;code&gt;]&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSONL&lt;/strong&gt;：直接在文件尾端直接 append 一个字符串与换行符 &lt;code&gt;\n&lt;/code&gt; 即可完成写入。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-大数据并行处理parallel-processing&#34;&gt;3. 大数据并行处理（Parallel Processing）
&lt;/h3&gt;&lt;p&gt;因为 &lt;code&gt;JSONL&lt;/code&gt; 的每一行都是独立的 JSON，大型文件可以从任意换行符切割成若干小区块，发送给多个 CPU Core 或计算节点进行并行运算，彼此完全互不干扰。&lt;/p&gt;
&lt;h2 id=&#34;开发者必知的-5-大-jsonl-严格格式铁律&#34;&gt;开发者必知的 5 大 JSONL 严格格式铁律
&lt;/h2&gt;&lt;p&gt;虽然 &lt;code&gt;JSONL&lt;/code&gt; 极具弹性，但为了确保解析器能顺利读取，官方规格（&lt;code&gt;jsonlines.org&lt;/code&gt;）订立了 5 大格式限制：&lt;/p&gt;
&lt;h3 id=&#34;规范详细说明&#34;&gt;规范详细说明
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;规范编号&lt;/th&gt;
          &lt;th&gt;铁律项目&lt;/th&gt;
          &lt;th&gt;说明与正确示范&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;规范 1&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;每一行必须是合法 JSON&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;每一行独立拿出来都必须能被标准的 &lt;code&gt;JSON.parse()&lt;/code&gt; 解析。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;规范 2&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;绝不能有未转义的换行&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;字符串内若含有换行，必须转义写成 &lt;code&gt;\n&lt;/code&gt;，&lt;strong&gt;禁用多行排版&lt;/strong&gt;。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;规范 3&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;禁用最外层符号&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;绝不可有最外层方括号 &lt;code&gt;[]&lt;/code&gt; ，行与行之间 &lt;strong&gt;不可加逗号&lt;/strong&gt; &lt;code&gt;,&lt;/code&gt; 。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;规范 4&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;UTF-8 无 BOM 编码&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;必须严格使用 &lt;code&gt;UTF-8&lt;/code&gt; 编码，且 &lt;strong&gt;不应包含 BOM 头&lt;/strong&gt;。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;规范 5&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;文件默认不含空行&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;每一行皆为有效数据，唯有文件最后一行允许空换行。&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;!--adsense--&gt;
&lt;h2 id=&#34;实战解析如何写出防御性高的-jsonl-读取代码&#34;&gt;实战解析：如何写出防御性高的 JSONL 读取代码？
&lt;/h2&gt;&lt;p&gt;在实际开发中，由于 &lt;code&gt;JSONL&lt;/code&gt; 具有 &lt;strong&gt;无固定 Schema（Schema-less）&lt;/strong&gt; 的特性，不同行的 &lt;code&gt;Key&lt;/code&gt; 可能完全不同。写代码解析时，建议遵守以下防御性原则：&lt;/p&gt;
&lt;h3 id=&#34;防御性代码示例python&#34;&gt;防御性代码示例（Python）
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;process_jsonl_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;with&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;open&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;r&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;encoding&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line_num&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;enumerate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;c1&#34;&gt;# 1. 自动跳过空白行（防止空白行导致解析失败）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strip&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;c1&#34;&gt;# 2. 防御性取值：使用 .get() 避免 KeyError&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;user_id&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;user_name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Unknown&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;c1&#34;&gt;# 3. 字段类型识别（多态数据处理）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;doc_type&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;default&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Line &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line_num&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: [&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;doc_type&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;] &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;user_id&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; - &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;user_name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDecodeError&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Error parsing line &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line_num&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 执行读取&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;process_jsonl_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;dataset.jsonl&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;关键防御技巧：使用 &lt;code&gt;strip()&lt;/code&gt; 清除首尾空白，并以 &lt;code&gt;.get()&lt;/code&gt; 代替直取键值，可避免 90% 以上的运行时崩溃！&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;jsonljson-与-csv-的场景选择指南&#34;&gt;JSONL、JSON 与 CSV 的场景选择指南
&lt;/h2&gt;&lt;p&gt;看完 &lt;code&gt;JSONL&lt;/code&gt; 的强大功能后，是不是该把所有数据都换成 &lt;code&gt;JSONL&lt;/code&gt; 呢？答案是：看使用场景！&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;场景需求&lt;/th&gt;
          &lt;th&gt;推荐使用格式&lt;/th&gt;
          &lt;th&gt;原因说明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;Web 前后端 API 传输&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;JSON&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;浏览器原生支持度高，单次传输数据量适中。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;导出数据给非技术人员/营销&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;CSV&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;可直接用 &lt;code&gt;Excel&lt;/code&gt; 打开查看。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;AI 模型微调 (Fine-tuning)&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;JSONL&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;OpenAI&lt;/code&gt; / &lt;code&gt;Anthropic&lt;/code&gt; API 官方指定训练格式。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;系统海量 Log 记录&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;JSONL&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;写入成本低、支持无限 append 与超低内存监控。&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;大数据 ETL 管线&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;JSONL&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;方便分布式切割与并行处理。&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;只要掌握各格式的特性，在正确的场景选择正确工具，就能让你的数据处理性能大幅提升！&lt;/p&gt;
&lt;!--adsense--&gt;
&lt;h2 id=&#34;reference&#34;&gt;Reference
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://jsonlines.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;JSON Lines Official Specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://jsonlines.org/examples/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;JSON Lines Examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
