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

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

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

一、 程序概述與核心功能

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

功能拆解如下:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

三、 算法與流程控制

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

算法步驟分解:

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

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

3.文件讀取與反序列化

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

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

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

5.遍歷與收集

  • 循環(huán):使用 for item in data["extracted"]:遍歷列表。這是算法中唯一的循環(huán)結(jié)構(gòu),時間復雜度為 O(n),其中 n 是 "extracted"列表的長度。
  • 條件過濾:在循環(huán)體內(nèi),使用 if "content" in item:檢查當前項是否包含目標字段。這是一個過濾操作,只有包含 "content"的項才會被處理。
  • 映射:對于符合條件的項,通過 item["content"]取出其值。這是一個從源數(shù)據(jù)項到目標值(content)的映射操作。
  • 聚合:使用 contents.append(item["content"])將映射得到的結(jié)果依次添加到一個列表中。這個 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對象轉(zhuǎn)換(序列化)為格式化的 JSON 字符串。
  • 文件寫入:將序列化后的字符串寫入到 outputs.json文件中。

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

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

算法特點總結(jié)

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

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

模塊導入import json。僅導入 Python 標準庫中的 json模塊,無任何外部依賴,保證了程序的可移植性和易于部署。

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

錯誤處理

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

文件操作

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

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

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

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

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

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

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

2. 擴展性建議:

當前程序功能單一且硬編碼。為了提高其復用性和靈活性,可以考慮以下擴展方向:

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

六、 總結(jié)

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

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

盡管目前其配置是硬編碼的,但它作為一個功能原型或特定流水線中的一環(huán),是完整且有效的。通過對其進行參數(shù)化和功能擴展,它可以輕松演進為一個功能更強大、適用范圍更廣的通用數(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)} 個內(nèi)容")
    except FileNotFoundError:
        print("錯誤:找不到 extraction_checkpoint.json 文件")
    except json.JSONDecodeError:
        print("錯誤:extraction_checkpoint.json 文件格式不正確")
    except Exception as e:
        print(f"發(fā)生錯誤:{str(e)}")
if __name__ == "__main__":
    main()

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

相關(guān)文章

最新評論

安溪县| 南昌县| 邳州市| 浦城县| 乌鲁木齐市| 科技| 兴隆县| 武山县| 桐庐县| 大同县| 嘉鱼县| 荔浦县| 花莲县| 蚌埠市| 林西县| 石河子市| 乐亭县| 合作市| 和硕县| 玛沁县| 永兴县| 萝北县| 黄陵县| 响水县| 曲周县| 玉山县| 宁强县| 潮安县| 建阳市| 扎赉特旗| 囊谦县| 龙州县| 霸州市| 米泉市| 舒兰市| 叙永县| 武威市| 稷山县| 五河县| 嘉祥县| 铜山县|