Python腳本實(shí)現(xiàn)JSON數(shù)據(jù)提取與重組工具
一、 功能概述
一個(gè)專注于數(shù)據(jù)提取與重組的Python腳本工具。其核心使命是自動(dòng)化地從一個(gè)名為 results.json的源數(shù)據(jù)文件中,批量提取出名為 output的特定字段的值,并將這些值重新封裝到一個(gè)結(jié)構(gòu)化的新文件 outputs.json中。
可以將其理解為數(shù)據(jù)流水線中的一個(gè) “字段提取器”? 或 “數(shù)據(jù)蒸餾器”。它解決了一個(gè)常見的數(shù)據(jù)處理痛點(diǎn):當(dāng)從一個(gè)包含多維信息的復(fù)雜數(shù)據(jù)源(results.json)中,只關(guān)心某一個(gè)特定維度的數(shù)據(jù)(output字段)用于后續(xù)分析、可視化或報(bào)告時(shí),手動(dòng)復(fù)制粘貼效率低下且易出錯(cuò)。此腳本通過編程方式,實(shí)現(xiàn)了該過程的批量化、自動(dòng)化與標(biāo)準(zhǔn)化。
核心功能拆解:
- 數(shù)據(jù)讀取:安全地讀取并解析JSON格式的源文件(
./results.json)。 - 目標(biāo)字段提取:遍歷源數(shù)據(jù)中的所有條目,精準(zhǔn)定位并收集每個(gè)條目下的
output字段值。 - 數(shù)據(jù)重組:將收集到的所有
output值,按照預(yù)定義的新結(jié)構(gòu)(一個(gè)包含outputs鍵的字典)進(jìn)行封裝。 - 數(shù)據(jù)持久化:將重組后的數(shù)據(jù)以格式化的JSON形式寫入一個(gè)新的目標(biāo)文件(
./outputs.json)。 - 狀態(tài)反饋與錯(cuò)誤處理:在控制臺輸出操作結(jié)果(如成功提取的數(shù)量)或捕獲并報(bào)告運(yùn)行時(shí)可能出現(xiàn)的各種異常(如文件不存在、格式錯(cuò)誤等)。
二、 代碼結(jié)構(gòu)與執(zhí)行流程分析
程序采用經(jīng)典的Python腳本結(jié)構(gòu),清晰明了。
1.入口與執(zhí)行邏輯? (if __name__ == “__main__”:):這是Python模塊的標(biāo)準(zhǔn)執(zhí)行入口。它檢查當(dāng)前腳本是否被直接運(yùn)行(而非作為模塊導(dǎo)入)。當(dāng)直接運(yùn)行 python tiqu.py時(shí),條件成立,隨即調(diào)用 extract_outputs()函數(shù),啟動(dòng)整個(gè)提取流程。這種設(shè)計(jì)增強(qiáng)了代碼的模塊性,使得 extract_outputs函數(shù)既可以被獨(dú)立腳本調(diào)用,也可以在將來被其他模塊導(dǎo)入和復(fù)用。
2.核心函數(shù)? extract_outputs():這是腳本的“大腦”,所有主要邏輯都封裝在此函數(shù)內(nèi)。函數(shù)內(nèi)部采用了“嘗試-異常(try-except)”的防御式編程結(jié)構(gòu),確保了程序的健壯性。
標(biāo)準(zhǔn)執(zhí)行流(無異常發(fā)生):
步驟1:文件讀取與解析
with open(‘./results.json’, ‘r’, encoding=‘utf-8’) as file:使用上下文管理器打開文件。這是一種最佳實(shí)踐,它能確保無論在代碼塊中是否發(fā)生異常,文件都會(huì)被正確關(guān)閉,避免資源泄漏。指定 utf-8編碼確保了其對多語言文本(如中文)的良好支持。
data = json.load(file):調(diào)用 json模塊的 load函數(shù),將文件對象反序列化為Python原生數(shù)據(jù)結(jié)構(gòu)(通常是列表或字典)。
步驟2:數(shù)據(jù)提取
outputs_list = [item.get(‘output’, ‘’) for item in data]:這是整個(gè)腳本的算法核心。它使用列表推導(dǎo)式,一種簡潔高效的Python語法,遍歷 data中的每一個(gè) item。對于每個(gè) item,使用 .get(‘output’, ‘’)方法安全地獲取 output鍵對應(yīng)的值。如果鍵不存在,則返回一個(gè)空字符串 ’’作為默認(rèn)值,防止程序因 KeyError而崩潰。所有獲取到的值被收集到一個(gè)新的列表 outputs_list中。
步驟3:數(shù)據(jù)結(jié)構(gòu)重組
output_data = {“outputs”: outputs_list}:創(chuàng)建一個(gè)新的字典 output_data。其唯一鍵是字符串 “outputs”,對應(yīng)的值就是上一步中提取出的所有 output值組成的列表。這個(gè)步驟完成了從原始結(jié)構(gòu)到目標(biāo)結(jié)構(gòu)的轉(zhuǎn)換。
步驟4:數(shù)據(jù)寫入
再次使用 with open上下文管理器,以寫入模式 (‘w’) 打開(或創(chuàng)建)./outputs.json文件。
json.dump(output_data, file, ensure_ascii=False, indent=2):將 output_data字典序列化為JSON字符串并寫入文件。
ensure_ascii=False:允許非ASCII字符(如中文)直接以其原樣(如Unicode)寫入文件,而不是被轉(zhuǎn)義為\uXXXX的形式,使得生成的文件對人類更可讀。indent=2:使用2個(gè)空格進(jìn)行縮進(jìn),生成格式美觀、具有層級結(jié)構(gòu)的JSON文件,便于人工查閱和調(diào)試。
步驟5:成功反饋
print(f“成功提取 {len(outputs_list)} 個(gè)output字段到outputs.json文件”):使用f-string格式化字符串,向用戶報(bào)告成功信息,并告知提取的具體數(shù)量,提供了明確的操作反饋。
3.異常處理流程? (except塊):
程序預(yù)見了三種常見錯(cuò)誤,并按優(yōu)先級從具體到一般進(jìn)行捕獲:
FileNotFoundError:最可能發(fā)生的錯(cuò)誤,即源文件results.json不存在于指定路徑。給出明確錯(cuò)誤提示。json.JSONDecodeError:源文件存在,但其內(nèi)容不符合JSON語法規(guī)范,無法解析。同樣給出明確提示。Exception as e:這是一個(gè)“兜底”的異常捕獲,處理所有其他未預(yù)見的運(yùn)行時(shí)錯(cuò)誤。通過print(f“發(fā)生錯(cuò)誤:{e}”)打印具體的異常信息,有助于高級調(diào)試。
三、 數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
本程序涉及兩個(gè)核心數(shù)據(jù)結(jié)構(gòu):輸入的源數(shù)據(jù)結(jié)構(gòu)和輸出的目標(biāo)數(shù)據(jù)結(jié)構(gòu)。
1.源數(shù)據(jù)(results.json)的假設(shè)結(jié)構(gòu):
從代碼 [item.get(‘output‘, ’’) for item in data]可以推斷,程序預(yù)期 data是一個(gè)可迭代對象,通常是一個(gè)列表(list)。
列表中的每個(gè) item預(yù)期是一個(gè)字典(dict)。
每個(gè) item字典中可能包含一個(gè)名為 “output”的鍵。該鍵對應(yīng)的值可以是任何JSON支持的類型,如字符串、數(shù)字、布爾值、數(shù)組、對象等,但根據(jù)程序上下文,通??赡苁亲址驍?shù)組。
示例假設(shè)結(jié)構(gòu):
[
{"id": 1, "input": "問題A", "output": "答案A", "score": 0.95},
{"id": 2, "input": "問題B", "output": "答案B", "score": 0.87},
{"id": 3, "input": "問題C", "score": 0.92}, // 此條目無output鍵
...
]2.目標(biāo)數(shù)據(jù)(outputs.json)的結(jié)構(gòu):
程序創(chuàng)建了一個(gè)全新的、高度聚焦的數(shù)據(jù)結(jié)構(gòu)。它是一個(gè)字典,僅包含一個(gè)鍵值對。
這種結(jié)構(gòu)極其簡潔,去除了所有無關(guān)字段,使得下游應(yīng)用可以毫無負(fù)擔(dān)地直接使用 outputs列表。
鍵:固定為字符串 “outputs”。
值:一個(gè)列表,其元素順序與源數(shù)據(jù) data中的條目順序嚴(yán)格一致。列表中每個(gè)元素就是對應(yīng)源條目中 output鍵的值。如果源條目中沒有 output鍵,則對應(yīng)位置是一個(gè)空字符串 ’’。
承接上例,生成的 outputs.json內(nèi)容為:
{
"outputs": ["答案A", "答案B", ""]
}四、 算法、編程思想與關(guān)鍵技術(shù)
1.列表推導(dǎo)式:這是Python中實(shí)現(xiàn)map和filter功能的精妙語法糖。[item.get(‘output‘, ’’) for item in data]一行代碼等價(jià)于一個(gè)for循環(huán),但更簡潔、執(zhí)行效率也通常更高。它清晰地表達(dá)了“從一個(gè)集合中映射出另一個(gè)集合”的語義。
2.防御性編程與健壯性設(shè)計(jì):
- 異常處理:全面的
try-except塊是程序穩(wěn)定性的基石。它區(qū)分了不同類型的錯(cuò)誤,并提供了友好的用戶提示,避免了程序因外部因素(文件缺失、格式錯(cuò)誤)而崩潰。 - 安全的字典訪問:使用
.get(key, default)方法而非直接通過item[‘output’]索引訪問。這是處理可能存在缺失鍵的字典時(shí)的最佳實(shí)踐,避免了潛在的KeyError,并通過提供默認(rèn)值(空字符串)保證了輸出列表長度的確定性和一致性。
3.上下文管理器:通過with open() as file:語句管理文件資源。這確保了即使在讀寫文件過程中發(fā)生異常,文件也能被正確關(guān)閉,資源得到及時(shí)釋放,避免了數(shù)據(jù)損壞或資源鎖定的問題。
4.數(shù)據(jù)序列化與反序列化:熟練運(yùn)用Python內(nèi)置的json模塊進(jìn)行load(從文件到對象)和dump(從對象到文件)操作,是實(shí)現(xiàn)程序與JSON文件這種通用數(shù)據(jù)格式交互的關(guān)鍵。
5.函數(shù)式封裝:將主要邏輯封裝在extract_outputs()函數(shù)中,并通過if __name__ == “__main__“:來調(diào)用,體現(xiàn)了“模塊化”的編程思想。這提高了代碼的可讀性、可測試性和可復(fù)用性。
五、 潛在應(yīng)用場景與擴(kuò)展方向
典型應(yīng)用場景:
- 機(jī)器學(xué)習(xí)/AI實(shí)驗(yàn)日志處理:
results.json可能是一次模型批量推理的結(jié)果日志,包含輸入、模型輸出、置信度分?jǐn)?shù)等。本腳本用于單獨(dú)提取所有“模型輸出”,用于后續(xù)的人工評估或自動(dòng)評測。 - API響應(yīng)批量提取:當(dāng)批量調(diào)用某個(gè)API并將所有響應(yīng)保存到一個(gè)JSON文件后,可以使用此腳本從每個(gè)響應(yīng)體中提取出核心的
output或data字段。 - 數(shù)據(jù)清洗與預(yù)處理管道:在ETL流程中,作為中間環(huán)節(jié),從復(fù)雜的半結(jié)構(gòu)化數(shù)據(jù)中抽取出所需的標(biāo)準(zhǔn)字段。
- 報(bào)告生成:從詳細(xì)的原始數(shù)據(jù)中提取關(guān)鍵指標(biāo)或結(jié)論,生成一個(gè)簡潔的數(shù)據(jù)源,供圖表生成工具使用。
擴(kuò)展與改進(jìn)方向:
增強(qiáng)靈活性:
- 參數(shù)化:通過命令行參數(shù)(如
argparse庫)或配置文件,允許用戶指定輸入/輸出文件路徑、目標(biāo)字段名(不硬編碼為output)、默認(rèn)值等。 - 多字段提取:擴(kuò)展為可以同時(shí)提取多個(gè)指定字段,并組織成更復(fù)雜的結(jié)構(gòu)(如列表套字典)。
提升性能:對于非常大的JSON文件(GB級別),可以考慮使用ijson等流式解析庫,以迭代方式處理,避免一次性加載全部數(shù)據(jù)到內(nèi)存。
增強(qiáng)功能:
- 過濾條件:在提取時(shí)加入條件判斷,例如只提取
score大于某閾值的output。 - 數(shù)據(jù)轉(zhuǎn)換:在提取過程中對
output值進(jìn)行簡單的清洗或轉(zhuǎn)換(如去除首尾空格、類型轉(zhuǎn)換)。
增強(qiáng)魯棒性與日志:
- 更精細(xì)的異常處理,例如區(qū)分文件權(quán)限錯(cuò)誤、磁盤空間不足等。
- 使用
logging模塊替代print語句,實(shí)現(xiàn)不同級別(INFO, WARNING, ERROR)的日志記錄,便于在后臺長期運(yùn)行或集成到系統(tǒng)中時(shí)進(jìn)行監(jiān)控。
六、 代碼質(zhì)量與風(fēng)格評估
優(yōu)點(diǎn):
- 結(jié)構(gòu)清晰:函數(shù)封裝和入口判斷使代碼結(jié)構(gòu)良好。
- 可讀性強(qiáng):變量名具有描述性(如
outputs_list,output_data),注釋雖然簡單但指明了關(guān)鍵部分。 - 健壯性好:全面的異常處理和安全的字典訪問方法。
- 符合規(guī)范:使用上下文管理器、指定文件編碼等,符合Python編程的最佳實(shí)踐。
可考慮優(yōu)化的點(diǎn):
- 路徑硬編碼:輸入輸出文件路徑硬編碼在代碼中。在生產(chǎn)環(huán)境中,建議通過參數(shù)或配置外部化。
- 單一次任務(wù):當(dāng)前腳本功能單一。雖然這是其設(shè)計(jì)目的,但作為示例,可以考慮提及如何擴(kuò)展為更通用的工具。
- 默認(rèn)值選擇:使用空字符串
’’作為缺失鍵的默認(rèn)值。這在某些場景下是合理的,但并非萬能。如果output字段本身預(yù)期是數(shù)字或復(fù)雜對象,空字符串可能不合適。根據(jù)具體業(yè)務(wù)邏輯選擇默認(rèn)值(如None)可能更優(yōu)。
總結(jié)
一個(gè)設(shè)計(jì)精良、功能聚焦、具備工業(yè)級健壯性的小型數(shù)據(jù)提取工具。它完美地詮釋了“單一職責(zé)原則”,將“從JSON列表中提取指定字段”這一任務(wù)完成得高效而可靠。其代碼體現(xiàn)了現(xiàn)代Python編程的諸多優(yōu)秀實(shí)踐,包括上下文管理、防御性編程、安全的字典操作、結(jié)構(gòu)化的異常處理以及清晰的數(shù)據(jù)轉(zhuǎn)換邏輯。盡管在靈活性和擴(kuò)展性上有其局限,但作為解決特定問題的專用腳本,它是一個(gè)非常出色的范本,并且其核心思想和代碼結(jié)構(gòu)可以輕松地被借鑒和擴(kuò)展以適應(yīng)更復(fù)雜的數(shù)據(jù)處理需求。通過參數(shù)化、功能增強(qiáng)和性能優(yōu)化,它可以成長為一個(gè)功能強(qiáng)大的通用數(shù)據(jù)提取實(shí)用程序。
源代碼
import json
def extract_outputs():
try:
# 讀取results2.json文件
with open('./results.json', 'r', encoding='utf-8') as file:
data = json.load(file)
# 提取所有output字段內(nèi)容
outputs_list = [item.get('output', '') for item in data]
# 創(chuàng)建新的數(shù)據(jù)結(jié)構(gòu)
output_data = {
"outputs": outputs_list
}
# 寫入outputs.json文件
with open('./outputs.json', 'w', encoding='utf-8') as file:
json.dump(output_data, file, ensure_ascii=False, indent=2)
print(f"成功提取 {len(outputs_list)} 個(gè)output字段到outputs.json文件")
except FileNotFoundError:
print("錯(cuò)誤:找不到results2.json文件")
except json.JSONDecodeError:
print("錯(cuò)誤:results2.json文件格式不正確")
except Exception as e:
print(f"發(fā)生錯(cuò)誤:{e}")
if __name__ == "__main__":
extract_outputs()到此這篇關(guān)于Python腳本實(shí)現(xiàn)JSON數(shù)據(jù)提取與重組工具的文章就介紹到這了,更多相關(guān)Python JSON數(shù)據(jù)提取與重組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)合并兩個(gè)有序列表的示例代碼
這篇文章主要介紹了python實(shí)現(xiàn)合并兩個(gè)有序列表的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
Python模擬伯努利試驗(yàn)和二項(xiàng)分布代碼實(shí)例
這篇文章主要介紹了Python模擬伯努利試驗(yàn)和二項(xiàng)分布代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Python自動(dòng)創(chuàng)建Excel并獲取內(nèi)容
這篇文章主要介紹了Python自動(dòng)創(chuàng)建Excel并獲取內(nèi)容,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
基于Python實(shí)現(xiàn)一鍵找出磁盤里所有貓照
最近在整理我磁盤上的照片,發(fā)現(xiàn)不少貓照,突然覺得若能把這些貓照都挑出來,觀察它們的成長軌跡也是一件不錯(cuò)的事情。一張一張的找實(shí)在是太費(fèi)勁了,能不能自動(dòng)化地找出來呢?本文將詳細(xì)為大家講講,需要的可以參考一下2022-05-05
時(shí)間序列重采樣和pandas的resample方法示例解析
這篇文章主要為大家介紹了時(shí)間序列重采樣和pandas的resample方法示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
對python_discover方法遍歷所有執(zhí)行的用例詳解
今天小編就為大家分享一篇對python_discover方法遍歷所有執(zhí)行的用例詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-02-02

