<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>CSV on Dev TLDRLSS</title>
        <link>https://dev.tldrlss.com/tags/csv/</link>
        <description>Recent content in CSV on Dev TLDRLSS</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-tw</language>
        <lastBuildDate>Sat, 01 Aug 2026 14:05:42 +0800</lastBuildDate><atom:link href="https://dev.tldrlss.com/tags/csv/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>JSONL 格式是什麼？JSONL 與 JSON 和 CSV 有什麼不同？AI 模型微調為什麼非用 JSONL 不可！</title>
        <link>https://dev.tldrlss.com/article/2026/08/jsonl-vs-json-csv-guide/</link>
        <pubDate>Sat, 01 Aug 2026 14:05:42 +0800</pubDate>
        
        <guid>https://dev.tldrlss.com/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>
