C語言中文網 目錄

Python讀取JSON文件

教程前面章節曾介紹過 JSON 格式的數據,這種格式的數據通常會被轉換為 Python 的 list 列表或 dict 字典。本節展示的是世界各國歷年 GDP 總和,數據來源于 https://datahub.io 網站。數據格式如下:

[{"Country Code":"ARB","Country Name":"Arab World",
"Value":25760683041.0857,"Year":1968},
{"Country Code:"ARB", "country Name":"Arab World",
"Value":28434203615.4829, "Year":1969},
...
]

上面的 JSON 格式數據被保存在方括號內,這些數據將會被轉換為 Python 的 list 列表,而 list 列表的每個元素將會是一個 dict 對象。

使用 Python 的 json 模塊讀取 JSON 數據非常簡單,只要使用 load() 函數加載 JSON 數據即可。下面程序示范了讀取 2016 年中國的 GDP 值:
import json

filename = 'gdp_json.json'

with open(filename) as f:
    gpd_list = json.load(f)
# 遍歷列表的每個元素,每個元素是一個GDP數據項
for gpd_dict in gpd_list:
    # 只顯示中國、2016年的GDP
    if gpd_dict['Year'] == 2016 and gpd_dict['Country Code'] == 'CHN':
        print(gpd_dict['Country Name'], gpd_dict['Value'])
上面程序中,第 6 行代碼調用 json 模塊的 load() 函數加載 JSON 數據,該函數將會返回一個 list 列表,接下來程序遍歷該 list 列表即可訪問到指定年份、指定國家的 GDP 值。

運行上面程序,可以看到如下輸出結果:

China 11199145157649.2

在掌握了使用 json 模塊讀取這份 JSON 數據的方法之后,接下來我們將會從中讀取從 2001 年到 2016 年中國、美國、日本、俄羅斯、加拿大這 5 個國家的 GDP 數據,并使用柱狀圖進行對比。

下面程序將會使用 Matplotlib 生成柱狀圖來展示這 5 個國家的 GDP 數據:
import json
from matplotlib import pyplot as plt
import numpy as np

filename = 'gdp_json.json'
# 讀取JSON格式的GDP數據
with open(filename) as f:
    gpd_list = json.load(f)
# 使用list列表依次保存中國、美國、日本、俄羅斯、加拿大的GDP值
country_gdps = [{}, {}, {}, {}, {}]
country_codes = ['CHN', 'USA', 'JPN', 'RUS', 'CAN']
# 遍歷列表的每個元素,每個元素是一個GDP數據項
for gpd_dict in gpd_list:
    for i, country_code in enumerate(country_codes):
        # 只讀取指定國家的數據
        if gpd_dict['Country Code'] == country_code:
            year = gpd_dict['Year']
            # 只讀取2001年到2016
            if 2017 > year > 2000:
                country_gdps[i][year] = gpd_dict['Value']
# 使用list列表依次保存中國、美國、日本、俄羅斯、加拿大的GDP值
country_gdp_list = [[], [], [], [], []]
# 構建時間數據
x_data = range(2001, 2017)
for i in range(len(country_gdp_list)):
    for year in x_data:
        # 除以1e8,讓數值變成以億為單位
        country_gdp_list[i].append(country_gdps[i][year] / 1e8)
bar_width=0.15
fig = plt.figure(dpi=128, figsize=(15, 8))
colors = ['indianred', 'steelblue', 'gold', 'lightpink', 'seagreen']
# 定義國家名稱列表
countries = ['中國', '美國', '日本', '俄羅斯', '加拿大']
# 采用循環繪制5組柱狀圖
for i in range(len(colors)):
    # 使用自定義X坐標將數據分開
    plt.bar(x=np.arange(len(x_data))+bar_width*i, height=country_gdp_list[i],
        label=countries[i], color=colors[i], alpha=0.8, width=bar_width)
    # 僅為中國、美國的條柱上繪制GDP數值
    if i < 2:
        for x, y in enumerate(country_gdp_list[i]):
            plt.text(x, y + 100, '%.0f' % y, ha='center', va='bottom')
# 為X軸設置刻度值
plt.xticks(np.arange(len(x_data))+bar_width*2, x_data)
# 設置標題
plt.title("2001到2016年各國GDP對比")
# 為兩條坐標軸設置名稱
plt.xlabel("年份")
plt.ylabel("GDP(億美元)")
# 顯示圖例
plt.legend()
plt.show()
本程序的重點其實在于前半部分代碼,這部分代碼控制程序從 JSON 數據中只讀取中國、美國、日本、俄羅斯、加拿大這 5 個國家的數據,且只讀取從 2001 年到 2016 年的 GDP 數據,因此程序處理起來稍微有點麻煩(程序先以年份為 key 的 dict(如程序中 country_gdps 列表的元素所示)來保存各國的 GDP 數據。

但由于 Matplotlib 要求被展示數據是 list 列表,因此上面程序中的第 26、28 兩行代碼使用循環依次讀取從 2001 年到 2016 年的 GDP 數據,并將這些數據添加到 country_gdp_list 列表的元素中。這樣就把 dict 形式的 GDP 數據轉換成 list 形式的 GDP 數據。

上面程序中的第 35、37 兩行代碼采用循環添加了 5 組柱狀圖,接下來程序還在中國、美國的條柱上繪制了 GDP 值。

運行上面程序,可以看到如圖 1 所示的柱狀圖。

從2001 年到2016 年各國GDP 對比柱狀圖
圖 1 從 2001 年到 2016 年各國GDP 對比柱狀圖

如果通過 https://datahub.io 網站下載了世界各國人口數據,就可以計算出以上各國的人均 GDP。下面程序會使用 Pygal 來展示世界各國的人均 GDP 數據。
import json
import pygal

filename = 'gdp_json.json'
# 讀取JSON格式的GDP數據
with open(filename) as f:
    gpd_list = json.load(f)
pop_filename = 'population-figures-by-country.json'
# 讀取JSON格式的人口數據
with open(pop_filename) as f:
    pop_list = json.load(f)

# 使用list列表依次保存美國、日本、俄羅斯、加拿大的人均GDP值
country_mean_gdps = [{}, {}, {}, {}]
country_codes = ['USA', 'JPN', 'RUS', 'CAN']
# 遍歷列表的每個元素,每個元素是一個GDP數據項
for gpd_dict in gpd_list:
    for i, country_code in enumerate(country_codes):
        # 只讀取指定國家的數據
        if gpd_dict['Country Code'] == country_code:
            year = gpd_dict['Year']
            # 只讀取2001年到2016
            if 2017 > year > 2000:
                for pop_dict in pop_list:
                    # 獲取指定國家的人口數據
                    if pop_dict['Country_Code'] == country_code:
                        # 使用該國GDP總值除以人口數量,得到人均GDP
                        country_mean_gdps[i][year] = round(gpd_dict['Value']
                            / pop_dict['Population_in_%d' % year])
# 使用list列表依次保存美國、日本、俄羅斯、加拿大的人均GDP值
country_mean_gdp_list = [[], [], [], []]
# 構建時間數據
x_data = range(2001, 2017)
for i in range(len(country_mean_gdp_list)):
    for year in x_data:
        country_mean_gdp_list[i].append(country_mean_gdps[i][year])
# 定義國家名稱列表
countries = ['美國', '日本', '俄羅斯', '加拿大']
# 創建pygal.Bar對象(柱狀圖)
bar = pygal.Bar()
# 采用循環添加代表條柱的數據
for i in range(len(countries)):
    bar.add(countries[i], country_mean_gdp_list[i])
bar.width=1100
# 設置X軸的刻度值
bar.x_labels = x_data
bar.title = '2001到2016年各國人均GDP對比'
# 設置X、Y軸的標題
bar.x_title = '年份'
bar.y_title = '人均GDP(美元)'
# 設置X軸的刻度值旋轉45度
bar.x_label_rotation = 45
# 設置將圖例放在底部
bar.legend_at_bottom = True
# 指定將數據圖輸出到SVG文件中
bar.render_to_file('mean_gdp.svg')
上面程序中,第 11 行代碼加載了一份新的關于人口數據的 JSON 文件,這樣程序即可通過該文件獲取世界各國歷史的人口數據。第 28 行代碼使用 GDP 總值除以該國的人口數量,這樣就可以得到該國的人均 GDP。

此程序的后半部分代碼創建了 pygal.Bar 對象,并使用循環為該對象添加了各國人均 GDP 數據,這樣該柱狀圖就可以展示各國的人均 GDP 值。

運行上面程序,可以看到如圖 2 所示的柱狀圖。

從 2001 年到 2016 年各國人均 GDP 對比柱狀圖
圖 2 從 2001 年到 2016 年各國人均 GDP 對比柱狀圖(點此查看高清大圖

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo