最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實(shí)現(xiàn)JSON數(shù)據(jù)提取與轉(zhuǎn)換的命令行工具程序

 更新時(shí)間:2026年04月09日 09:48:12   作者:XLYcmy  
這篇文章主要為大家詳細(xì)介紹了如何使用Python實(shí)現(xiàn)JSON數(shù)據(jù)提取與轉(zhuǎn)換的命令行工具程序,核心功能是從一個(gè)特定結(jié)構(gòu)的?JSON?輸入文件中提取特定數(shù)據(jù)并寫入到一個(gè)新的?JSON?文件中,感興趣的小伙伴可以了解下

一、 程序概述與核心功能

一個(gè)用于數(shù)據(jù)抽取與轉(zhuǎn)換的命令行工具程序,其核心功能是自動(dòng)化地從一個(gè)特定結(jié)構(gòu)的 JSON 輸入文件中讀取數(shù)據(jù),經(jīng)過處理,將其中用戶關(guān)心的部分(即 content字段的值)提取出來,并按照另一種結(jié)構(gòu)寫入到一個(gè)新的 JSON 輸出文件中。

功能拆解如下:

  • 數(shù)據(jù)讀取:程序啟動(dòng)后,會(huì)嘗試讀取當(dāng)前工作目錄下名為 extraction_checkpoint.json的文件。
  • 數(shù)據(jù)解析:將讀取的文件內(nèi)容解析為 Python 可操作的數(shù)據(jù)結(jié)構(gòu)(字典、列表等)。
  • 數(shù)據(jù)提取:在解析后的數(shù)據(jù)結(jié)構(gòu)中,沿著特定的路徑(data["extracted"])進(jìn)行導(dǎo)航,遍歷該路徑下的所有元素,并收集每個(gè)元素中名為 "content"的鍵所對(duì)應(yīng)的值。
  • 數(shù)據(jù)重組:將所有收集到的 content值,放入一個(gè)新的數(shù)據(jù)結(jié)構(gòu)中,該結(jié)構(gòu)以 "outputs"為鍵,以收集到的值列表為值。
  • 數(shù)據(jù)寫入:將重組后的新數(shù)據(jù)結(jié)構(gòu),序列化為 JSON 格式,并寫入到當(dāng)前工作目錄下名為 outputs.json的新文件中。
  • 狀態(tài)反饋:在控制臺(tái)輸出操作成功的提示信息,包含提取到的內(nèi)容數(shù)量。如果過程中發(fā)生錯(cuò)誤,則輸出相應(yīng)的錯(cuò)誤信息。

從更高層次看,這個(gè)程序?qū)崿F(xiàn)了一個(gè)簡(jiǎn)單的 ETL(Extract, Transform, Load)管道中的關(guān)鍵步驟:

  • Extract(抽?。?/strong>:從 extraction_checkpoint.json中讀取數(shù)據(jù)。
  • Transform(轉(zhuǎn)換):從原始復(fù)雜結(jié)構(gòu)中提取出目標(biāo)字段,并重新封裝。
  • Load(加載):將轉(zhuǎn)換結(jié)果保存到 outputs.json。

二、 數(shù)據(jù)結(jié)構(gòu)分析

程序的處理邏輯緊密依賴于輸入和輸出文件的 JSON 數(shù)據(jù)結(jié)構(gòu)。下面進(jìn)行詳細(xì)剖析。

1. 輸入數(shù)據(jù)結(jié)構(gòu) (extraction_checkpoint.json)

從代碼邏輯反向推導(dǎo),輸入文件必須是一個(gè)有效的 JSON 文件,并且其結(jié)構(gòu)需要滿足特定約定,否則程序會(huì)報(bào)錯(cuò)或無法提取到數(shù)據(jù)。

  • 根對(duì)象:輸入 JSON 的根預(yù)期是一個(gè)字典。
  • 關(guān)鍵鍵 "extracted":程序首先檢查根字典中是否存在鍵為 "extracted"的成員。這暗示輸入數(shù)據(jù)的主體部分被組織在 "extracted"之下。
  • "extracted"的值"extracted"鍵對(duì)應(yīng)的值預(yù)期是一個(gè)列表。這個(gè)列表包含了多個(gè)待處理的數(shù)據(jù)項(xiàng)。
  • 列表項(xiàng)結(jié)構(gòu):列表中的每一個(gè)元素(item)預(yù)期是一個(gè)字典。程序會(huì)遍歷這個(gè)列表。
  • 目標(biāo)鍵 "content":對(duì)于列表中的每一個(gè)字典項(xiàng),程序會(huì)檢查其是否包含鍵為 "content"的成員。這是程序要提取的核心數(shù)據(jù)字段。
  • "content"的值:該鍵對(duì)應(yīng)的值可以是任何有效的 JSON 數(shù)據(jù)類型(字符串、數(shù)字、布爾值、數(shù)組、對(duì)象等),程序會(huì)原封不動(dòng)地收集它。

示例化的輸入數(shù)據(jù)結(jié)構(gòu)可能如下:

{
  "extracted": [
    {
      "id": 1,
      "metadata": {"author": "Alice"},
      "content": "這是第一條需要提取的文本內(nèi)容。"
    },
    {
      "id": 2,
      "metadata": {"author": "Bob"},
      "content": {"title": "第二條內(nèi)容", "body": "這里可能是一個(gè)嵌套對(duì)象。"}
    },
    {
      "timestamp": "2023-10-27",
      "content": 42.5
    }
  ],
  "status": "completed",
  "other_field": "忽略此字段"
}

在上述示例中,程序會(huì)成功提取出三個(gè) content的值:一個(gè)字符串、一個(gè)嵌套對(duì)象和一個(gè)浮點(diǎn)數(shù)。"status""other_field"等根層級(jí)的其他鍵會(huì)被忽略。

2. 輸出數(shù)據(jù)結(jié)構(gòu) (outputs.json)

輸出文件的結(jié)構(gòu)由程序在 output_data變量中明確定義,相對(duì)簡(jiǎn)單。

  • 根對(duì)象:一個(gè)字典。
  • 唯一鍵 "outputs":這個(gè)字典有且僅有一個(gè)鍵,即 "outputs"
  • "outputs"的值:一個(gè)列表。這個(gè)列表按原輸入數(shù)據(jù)中 "extracted"列表的順序,依次包含了所有成功提取到的 "content"字段的值。

對(duì)應(yīng)于上述輸入示例,輸出文件內(nèi)容將為:

{
  "outputs": [
    "這是第一條需要提取的文本內(nèi)容。",
    {"title": "第二條內(nèi)容", "body": "這里可能是一個(gè)嵌套對(duì)象。"},
    42.5
  ]
}

輸出結(jié)構(gòu)高度簡(jiǎn)潔,去除了所有元數(shù)據(jù)和其他字段,只保留了最核心的 content數(shù)據(jù)流。

三、 算法與流程控制

程序的算法是線性的、確定性的,主要包含一個(gè)順序流程和一個(gè)循環(huán)遍歷結(jié)構(gòu)。我們可以將其視為一個(gè)簡(jiǎn)單的數(shù)據(jù)過濾和映射管道。

算法步驟分解:

1.啟動(dòng)與入口:當(dāng)腳本被直接運(yùn)行時(shí) (if __name__ == "__main__":),調(diào)用 main()函數(shù),進(jìn)入主流程。

2.異常處理框架:主流程被包裹在一個(gè) try-except塊中,這是程序的安全外殼,確保了程序在遇到常見錯(cuò)誤時(shí)不會(huì)崩潰,而是能給出友好的錯(cuò)誤信息。

3.文件讀取與反序列化

  • 操作:使用 open()函數(shù)以只讀模式和 UTF-8 編碼打開 extraction_checkpoint.json文件,并利用 json.load(f)方法。
  • 算法意義:完成了從“字節(jié)流/字符串”到“內(nèi)存中的結(jié)構(gòu)化對(duì)象”的轉(zhuǎn)換。json.load()內(nèi)部實(shí)現(xiàn)了 JSON 語(yǔ)法的解析器,是算法的關(guān)鍵組成部分。

4.數(shù)據(jù)提取(核心算法)

  • 路徑訪問:通過 data["extracted"]訪問目標(biāo)列表。這是一個(gè) O(1) 時(shí)間復(fù)雜度的字典鍵查找操作。
  • 條件判斷:使用 if "extracted" in data:進(jìn)行防御性檢查,防止因鍵不存在而引發(fā) KeyError

5.遍歷與收集

  • 循環(huán):使用 for item in data["extracted"]:遍歷列表。這是算法中唯一的循環(huán)結(jié)構(gòu),時(shí)間復(fù)雜度為 O(n),其中 n 是 "extracted"列表的長(zhǎng)度。
  • 條件過濾:在循環(huán)體內(nèi),使用 if "content" in item:檢查當(dāng)前項(xiàng)是否包含目標(biāo)字段。這是一個(gè)過濾操作,只有包含 "content"的項(xiàng)才會(huì)被處理。
  • 映射:對(duì)于符合條件的項(xiàng),通過 item["content"]取出其值。這是一個(gè)從源數(shù)據(jù)項(xiàng)到目標(biāo)值(content)的映射操作。
  • 聚合:使用 contents.append(item["content"])將映射得到的結(jié)果依次添加到一個(gè)列表中。這個(gè) contents列表就是最終的提取結(jié)果集合。

6.數(shù)據(jù)序列化與寫入

  • 結(jié)構(gòu)重組:創(chuàng)建新的字典 output_data,將 contents列表作為其 "outputs"的值。
  • 序列化:使用 json.dump(output_data, f, ensure_ascii=False, indent=2)將內(nèi)存中的 output_data對(duì)象轉(zhuǎn)換(序列化)為格式化的 JSON 字符串。
  • 文件寫入:將序列化后的字符串寫入到 outputs.json文件中。

7.狀態(tài)反饋:在控制臺(tái)打印成功信息,包含提取的數(shù)量 (len(contents))。

8.異常處理:如果在上述任何步驟中發(fā)生 FileNotFoundError、json.JSONDecodeError或其他任何 Exception,程序會(huì)跳過正常流程,執(zhí)行對(duì)應(yīng)的 except塊,在控制臺(tái)打印相應(yīng)的錯(cuò)誤信息,并優(yōu)雅終止。

算法特點(diǎn)總結(jié)

  • 確定性:對(duì)于相同的輸入,必然產(chǎn)生相同的輸出。
  • 無狀態(tài)性:程序不依賴任何外部狀態(tài)或歷史運(yùn)行記錄,每次運(yùn)行都是獨(dú)立的。
  • 函數(shù)式風(fēng)格:核心的“遍歷-過濾-映射-收集”模式與函數(shù)式編程中的思想吻合,盡管是用命令式語(yǔ)法實(shí)現(xiàn)的。

四、 代碼實(shí)現(xiàn)細(xì)節(jié)與編程實(shí)踐

模塊導(dǎo)入import json。僅導(dǎo)入 Python 標(biāo)準(zhǔn)庫(kù)中的 json模塊,無任何外部依賴,保證了程序的可移植性和易于部署。

函數(shù)封裝:邏輯被封裝在 main()函數(shù)中,并通過 if __name__ == "__main__":進(jìn)行調(diào)用。這是一種良好的實(shí)踐,使得該腳本既可以作為獨(dú)立程序運(yùn)行,其核心函數(shù)又可以在未來被其他模塊導(dǎo)入和調(diào)用(盡管當(dāng)前 main()函數(shù)設(shè)計(jì)為獨(dú)立運(yùn)行)。

錯(cuò)誤處理

  • FileNotFoundError:處理輸入文件不存在的常見情況。
  • json.JSONDecodeError:處理輸入文件不是有效 JSON 格式的情況。json.load()在解析失敗時(shí)會(huì)拋出此異常。
  • Exception:作為一個(gè)寬泛的捕獲器,處理其他未預(yù)料到的異常。在生產(chǎn)環(huán)境中,建議更具體地捕獲已知異常,而將 Exception作為最后保障。
  • 每個(gè)錯(cuò)誤處理塊都提供了明確的中文錯(cuò)誤提示,提高了用戶體驗(yàn)。

文件操作

  • 使用 with open(...) as f:上下文管理器,確保文件在使用后會(huì)被正確關(guān)閉,即使發(fā)生異常也是如此。
  • 指定了 encoding='utf-8',確保了正確處理非 ASCII 字符(如中文),避免了編碼問題。
  • 輸出時(shí)使用 ensure_ascii=False,這使得中文字符等能直接以原樣(而非 \uXXXX形式的 Unicode 轉(zhuǎn)義序列)寫入 JSON 文件,提高了結(jié)果的可讀性。
  • 使用 indent=2對(duì)輸出 JSON 進(jìn)行美化格式化,便于人工閱讀和檢查。

數(shù)據(jù)處理

  • 使用 if "extracted" in data:if "content" in item:進(jìn)行存在性檢查,這是健壯代碼的關(guān)鍵。如果直接訪問不存在的鍵,會(huì)引發(fā) KeyError導(dǎo)致程序崩潰。
  • 初始化一個(gè)空列表 contents = []用于收集結(jié)果,邏輯清晰。

用戶反饋:成功時(shí),使用 print輸出提取的內(nèi)容數(shù)量,提供了即時(shí)、明確的執(zhí)行反饋。

五、 潛在應(yīng)用場(chǎng)景與擴(kuò)展性分析

1. 典型應(yīng)用場(chǎng)景:

  • 日志/中間結(jié)果處理extraction_checkpoint.json可能是一個(gè)大型數(shù)據(jù)處理流水線(如網(wǎng)絡(luò)爬蟲、文檔解析器、機(jī)器學(xué)習(xí)特征提取階段)產(chǎn)生的中間檢查點(diǎn)文件。tiqux.py的作用是從這個(gè)結(jié)構(gòu)化的檢查點(diǎn)中,剝離出最核心的、已處理好的“內(nèi)容”數(shù)據(jù),為下一階段(如分析、入庫(kù)、展示)提供干凈的輸入。
  • API響應(yīng)清洗:當(dāng)從某個(gè) RESTful API 獲取的 JSON 響應(yīng)結(jié)構(gòu)復(fù)雜、嵌套很深,而用戶只關(guān)心其中某一特定字段的集合時(shí),可以保存 API 響應(yīng),然后使用此腳本進(jìn)行批量提取。
  • 數(shù)據(jù)格式轉(zhuǎn)換:作為不同系統(tǒng)間數(shù)據(jù)交換的適配器。將系統(tǒng) A 輸出的特定格式 JSON,轉(zhuǎn)換為系統(tǒng) B 要求的簡(jiǎn)化格式 JSON。

2. 擴(kuò)展性建議:

當(dāng)前程序功能單一且硬編碼。為了提高其復(fù)用性和靈活性,可以考慮以下擴(kuò)展方向:

  • 參數(shù)化:通過命令行參數(shù)(如使用 argparse庫(kù))或配置文件來指定輸入文件路徑、輸出文件路徑、目標(biāo)字段的路徑(如從 "extracted"改為其他鍵)、輸出結(jié)果的鍵名等。
  • 處理更復(fù)雜的路徑:當(dāng)前路徑是固定的(data["extracted"][i]["content"])??梢詳U(kuò)展為支持類似 jq或 JSONPath 的查詢語(yǔ)法,以提取嵌套更深或更復(fù)雜的數(shù)據(jù)。
  • 批量處理:修改程序,使其能處理一個(gè)目錄下的多個(gè) JSON 文件,或?qū)⑻崛〗Y(jié)果追加到同一個(gè)輸出文件中。
  • 豐富輸出格式:除了 JSON,還可以支持輸出為 CSV、純文本文件等格式。
  • 添加日志系統(tǒng):用更專業(yè)的日志記錄器(logging模塊)替代 print語(yǔ)句,可以記錄不同級(jí)別(INFO, WARNING, ERROR)的信息,并輸出到文件。
  • 性能優(yōu)化:對(duì)于巨大的 JSON 文件,可以考慮使用 ijson等流式解析庫(kù),以增量方式讀取和處理,避免一次性加載整個(gè)文件到內(nèi)存。

六、 總結(jié)

一個(gè)結(jié)構(gòu)清晰、功能聚焦、具備基本魯棒性的 Python 實(shí)用腳本。它完美地詮釋了 Unix 哲學(xué)中“做好一件事”的理念。其核心價(jià)值在于自動(dòng)化了一個(gè)常見但繁瑣的數(shù)據(jù)處理任務(wù):從一個(gè)具有固定結(jié)構(gòu)的嵌套 JSON 數(shù)據(jù)源中,批量提取指定字段。

程序在數(shù)據(jù)結(jié)構(gòu)上,定義了從 {"extracted": [{"content": value}, ...]}{"outputs": [value, ...]}的轉(zhuǎn)換規(guī)則。在算法上,它采用了經(jīng)典的“讀取-解析-遍歷-提取-寫入”線性流程,并通過異常處理機(jī)制增強(qiáng)了穩(wěn)定性。在代碼實(shí)現(xiàn)上,它遵循了 Python 的常見最佳實(shí)踐,如使用上下文管理器、明確的編碼、防御性編程等。

盡管目前其配置是硬編碼的,但它作為一個(gè)功能原型或特定流水線中的一環(huán),是完整且有效的。通過對(duì)其進(jìn)行參數(shù)化和功能擴(kuò)展,它可以輕松演進(jìn)為一個(gè)功能更強(qiáng)大、適用范圍更廣的通用數(shù)據(jù)提取工具。

七、源代碼

import json
def main():
    try:
        # 讀取 extraction_checkpoint.json 文件
        with open('./extraction_checkpoint.json', 'r', encoding='utf-8') as f:
            data = json.load(f)
        # 提取所有content字段的值
        contents = []
        if "extracted" in data:
            for item in data["extracted"]:
                if "content" in item:
                    contents.append(item["content"])
        # 創(chuàng)建輸出數(shù)據(jù)結(jié)構(gòu)
        output_data = {
            "outputs": contents
        }
        # 寫入 outputs.json 文件
        with open('outputs.json', 'w', encoding='utf-8') as f:
            json.dump(output_data, f, ensure_ascii=False, indent=2)
        print(f"成功生成 outputs.json 文件,共提取 {len(contents)} 個(gè)內(nèi)容")
    except FileNotFoundError:
        print("錯(cuò)誤:找不到 extraction_checkpoint.json 文件")
    except json.JSONDecodeError:
        print("錯(cuò)誤:extraction_checkpoint.json 文件格式不正確")
    except Exception as e:
        print(f"發(fā)生錯(cuò)誤:{str(e)}")
if __name__ == "__main__":
    main()

到此這篇關(guān)于Python實(shí)現(xiàn)JSON數(shù)據(jù)提取與轉(zhuǎn)換的命令行工具程序的文章就介紹到這了,更多相關(guān)Python JSON數(shù)據(jù)提取與轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何利用python創(chuàng)建、讀取和修改CSV數(shù)據(jù)文件

    如何利用python創(chuàng)建、讀取和修改CSV數(shù)據(jù)文件

    csv文件與txt文件類似,區(qū)別點(diǎn)就是在csv文件中,字段間使用“,”或“|”隔開,達(dá)到類似與表格的效果,下面這篇文章主要給大家介紹了關(guān)于如何利用python創(chuàng)建、讀取和修改CSV數(shù)據(jù)文件的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • python如何通過正則匹配指定字符開頭與結(jié)束提取中間內(nèi)容

    python如何通過正則匹配指定字符開頭與結(jié)束提取中間內(nèi)容

    這篇文章主要介紹了python通過正則匹配指定字符開頭與結(jié)束提取中間內(nèi)容的操作方法,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • pyecharts如何實(shí)現(xiàn)顯示數(shù)據(jù)為百分比的柱狀圖

    pyecharts如何實(shí)現(xiàn)顯示數(shù)據(jù)為百分比的柱狀圖

    這篇文章主要介紹了pyecharts如何實(shí)現(xiàn)顯示數(shù)據(jù)為百分比的柱狀圖,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Python 判斷奇數(shù)偶數(shù)的方法

    Python 判斷奇數(shù)偶數(shù)的方法

    今天小編就為大家分享一篇Python 判斷奇數(shù)偶數(shù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 利用Pycharm斷點(diǎn)調(diào)試Python程序的方法

    利用Pycharm斷點(diǎn)調(diào)試Python程序的方法

    今天小編就為大家分享一篇利用Pycharm斷點(diǎn)調(diào)試Python程序的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Python中的各種裝飾器解析

    Python中的各種裝飾器解析

    這篇文章主要介紹了Python中的各種裝飾器解析,Python裝飾器可以在不改變函數(shù)原實(shí)現(xiàn)方式的前提下,為函數(shù)添加額外的功能,需要的朋友可以參考下
    2023-11-11
  • 如何利用Anaconda配置簡(jiǎn)單的Python環(huán)境

    如何利用Anaconda配置簡(jiǎn)單的Python環(huán)境

    這篇文章主要為大家詳細(xì)介紹了如何利用Anaconda配置簡(jiǎn)單的Python環(huán)境,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • Python使用re模塊實(shí)現(xiàn)信息篩選的方法

    Python使用re模塊實(shí)現(xiàn)信息篩選的方法

    這篇文章主要介紹了Python使用re模塊實(shí)現(xiàn)信息篩選的方法,結(jié)合實(shí)例形式分析了Python正則re模塊進(jìn)行信息篩選操作的相關(guān)實(shí)現(xiàn)技巧及相關(guān)函數(shù)使用技巧,需要的朋友可以參考下
    2018-04-04
  • Python的requests網(wǎng)絡(luò)編程包使用教程

    Python的requests網(wǎng)絡(luò)編程包使用教程

    requests包為Python擴(kuò)展了各種基于HTTP的網(wǎng)絡(luò)數(shù)據(jù)操作功能,包括各種請(qǐng)求與session和cookie等的追加,very強(qiáng)大,下面我們就來看一下Python的requests網(wǎng)絡(luò)編程包使用教程
    2016-07-07
  • 如何使用pandas讀取txt文件中指定的列(有無標(biāo)題)

    如何使用pandas讀取txt文件中指定的列(有無標(biāo)題)

    這篇文章主要介紹了如何使用pandas讀取txt文件中指定的列(有無標(biāo)題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03

最新評(píng)論

赤峰市| 盐山县| 枣阳市| 济源市| 南皮县| 横山县| 兴业县| 栾川县| 福鼎市| 黑龙江省| 琼结县| 永胜县| 那曲县| 武隆县| 焦作市| 固阳县| 宁波市| 永城市| 遵化市| 芦山县| 深水埗区| 关岭| 黔西县| 江城| 务川| 翁牛特旗| 金湖县| 石渠县| 辛集市| 双鸭山市| 邵阳县| 香河县| 黄陵县| 巧家县| 称多县| 邮箱| 厦门市| 曲阜市| 宜宾县| 吴江市| 闽清县|