Python讀取JSON文件及一些常見的陷阱和改進(jìn)方法
前言
在 Python 編程中,JSON(JavaScript Object Notation)是一種常用的輕量級(jí)數(shù)據(jù)交換格式。我們經(jīng)常需要從本地文件中讀取 JSON 數(shù)據(jù)并進(jìn)行處理。本文將以一個(gè)簡(jiǎn)單的讀取 JSON 文件的代碼示例為起點(diǎn),逐步進(jìn)行優(yōu)化,同時(shí)深入探討一些常見的陷阱和改進(jìn)方法。
1. 初始代碼:簡(jiǎn)單的 JSON 文件讀取
以下是最基礎(chǔ)的讀取本地 JSON 文件的代碼示例:
import json global data; if __name__ == '__main__': with open('account.json', 'r', encoding='utf-8') as file: data = json.load(file) print(data)
這段代碼能夠正常讀取本地名為 account.json
的 JSON 文件,并將其內(nèi)容打印出來(lái)。然而,代碼中有一些可以優(yōu)化的地方,尤其是在變量作用域和代碼可擴(kuò)展性方面。
2. 分析與優(yōu)化方向
global 的使用:代碼中的
global
關(guān)鍵字用來(lái)聲明全局變量,通常用于在函數(shù)內(nèi)部修改全局變量的值。但在此代碼中,data
變量是在主作用域中定義并使用的,global
其實(shí)是多余的。去掉global
不會(huì)影響代碼的正常運(yùn)行,并且使代碼更簡(jiǎn)潔。異常處理:當(dāng)前的代碼假設(shè)文件始終存在且格式正確,但在真實(shí)環(huán)境中,可能會(huì)出現(xiàn)文件路徑錯(cuò)誤、文件不存在或 JSON 格式不正確的情況。如果不處理這些情況,程序會(huì)直接崩潰并拋出錯(cuò)誤。因此,引入異常處理機(jī)制是非常重要的改進(jìn)。
函數(shù)封裝:為了使代碼具有更好的可維護(hù)性和復(fù)用性,建議將讀取 JSON 文件的邏輯封裝成一個(gè)函數(shù)。這樣不僅提高了代碼的清晰度,還便于以后調(diào)用。
3. 代碼優(yōu)化步驟
我們從去掉多余的 global
關(guān)鍵字開始,然后逐步進(jìn)行代碼優(yōu)化。
去掉 global 關(guān)鍵字
在 Python 中,global
通常用于函數(shù)內(nèi)部來(lái)修改全局變量。在當(dāng)前場(chǎng)景下,data
是在主函數(shù)中定義的,因此是全局變量,根本不需要顯式使用 global
。去掉 global
后,代碼更清晰:
import json if __name__ == '__main__': with open('account.json', 'r', encoding='utf-8') as file: data = json.load(file) print(data)
增加異常處理
為了讓代碼更加健壯,我們需要考慮以下幾個(gè)場(chǎng)景:
- 文件不存在。
- JSON 文件格式不正確。
可以通過(guò) try-except
語(yǔ)句來(lái)捕獲這些異常,并在發(fā)生錯(cuò)誤時(shí)給出用戶友好的提示:
import json if __name__ == '__main__': try: with open('account.json', 'r', encoding='utf-8') as file: data = json.load(file) print(data) except FileNotFoundError: print("文件未找到,請(qǐng)檢查文件路徑") except json.JSONDecodeError: print("文件格式錯(cuò)誤,請(qǐng)檢查是否為有效的 JSON 格式")
函數(shù)封裝
為了提高代碼的模塊化和可復(fù)用性,我們將文件讀取的邏輯封裝到一個(gè)函數(shù)中。這樣,當(dāng)你在其他地方需要讀取 JSON 文件時(shí),直接調(diào)用這個(gè)函數(shù)即可,避免代碼重復(fù):
import json def load_json_file(file_path): """讀取 JSON 文件并返回解析后的數(shù)據(jù)""" try: with open(file_path, 'r', encoding='utf-8') as file: return json.load(file) except FileNotFoundError: print(f"文件 '{file_path}' 未找到") except json.JSONDecodeError: print(f"文件 '{file_path}' 格式錯(cuò)誤") return None if __name__ == '__main__': data = load_json_file('account.json') if data: print(data)
4. 代碼解釋
函數(shù) load_json_file():此函數(shù)接受一個(gè)文件路徑作為參數(shù),負(fù)責(zé)讀取并解析 JSON 文件。它不僅提高了代碼的可讀性和擴(kuò)展性,還便于錯(cuò)誤處理。
異常處理:我們使用
FileNotFoundError
來(lái)處理文件不存在的情況,使用json.JSONDecodeError
處理文件內(nèi)容格式不正確的情況。這些異常處理有助于提高代碼的健壯性,避免因文件問(wèn)題導(dǎo)致的程序崩潰。if data::在讀取文件時(shí),返回的
data
可能是None
(在文件讀取失敗的情況下)。因此,我們需要檢查數(shù)據(jù)是否成功讀取,只有成功時(shí)才輸出內(nèi)容。
5. 小結(jié)
通過(guò)一系列的優(yōu)化步驟,我們使得代碼從最初的簡(jiǎn)單讀取 JSON 文件,變得更具容錯(cuò)性和擴(kuò)展性。這些改進(jìn)包括去掉不必要的 global
關(guān)鍵字、增加異常處理以及通過(guò)函數(shù)封裝提高代碼的可維護(hù)性。
最終優(yōu)化后的代碼更具通用性,可以處理各種潛在的異常,同時(shí)結(jié)構(gòu)更加清晰、簡(jiǎn)潔。無(wú)論是初學(xué)者還是有經(jīng)驗(yàn)的開發(fā)者,都可以從這篇文章中學(xué)到如何編寫更健壯的 Python 代碼。
擴(kuò)展閱讀:
到此這篇關(guān)于Python讀取JSON文件及一些常見的陷阱和改進(jìn)方法的文章就介紹到這了,更多相關(guān)Python讀取JSON文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python使用pandas處理excel文件轉(zhuǎn)為csv文件的方法示例
這篇文章主要介紹了python使用pandas處理excel文件轉(zhuǎn)為csv文件的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07python 實(shí)現(xiàn)將文件或文件夾用相對(duì)路徑打包為 tar.gz 文件的方法
今天小編就為大家分享一篇python 實(shí)現(xiàn)將文件或文件夾用相對(duì)路徑打包為 tar.gz 文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06pandas數(shù)據(jù)處理清洗實(shí)現(xiàn)中文地址拆分案例
因?yàn)楹罄m(xù)數(shù)據(jù)分析工作需要用到地理維度進(jìn)行分析,所以需要把login_place字段進(jìn)行拆分成:國(guó)家、省份、地區(qū)。感興趣的可以了解一下2021-06-06