Python3用簡單的方法,將一組具有相同格式的json數據,整理到excel中

在日常使用爬蟲抓取數據的過程中,很多站點回傳的數據是json格式的。
當抓取到幾百條數據後,想要快速的掌握這些數據的特徵,比較好的方法就是直接導出到excel,直觀的去看。

下面介紹一下,如何簡單的通過python,將json數據整理到excel。
(寫完發現大部分篇幅都用於介紹如何解除json嵌套關係了,實際轉換並導出excel的部分,連同導入模塊在內只用了3行代碼,想看這個的可以直接拖動到本文最下方查看)
一組具有相同格式的json數據
轉換成Excel

1、首先解除json的嵌套關係

假設一組具有相同格式的json數據,保存在列表json_arr中。
列表中的每條json數據格式如下:

{
	'code': 200,
	'msg': 'ok',
	'data': {
		'logId': '5a8795xxxxxxxxxxxxxxxxc15631',
		'errorClass': 1,
		'appKey': '527xxxxxxxxxxxxd000067',
		'appVersion': 'xxx',
		'channel': 'baidu',
		'deviceType': 'vivo X9s',
		'deviceVersion': None,
		'arch': 'AArch64 Processor rev 0 (aarch64)',
		'appPackageName': 'xxx.xxx.android',
		'os': 'android',
		'osVersion': '8.1.0',
		'jailbroken': 'false',
		'disk': -1.0,
		'sddisk': -1.0,
		'mem': -1.0,
		'cpu': None,
		'battery': -1.0,
		'temp': -1.0,
		'clientTime': '2019-07-17 13:59:07',
		'serverTime': '2019-07-17 14:14:43',
		'stackMd5': '7663999xxxxxxxxxxxxxd0a14',
		'umid': None
	},
	'timestamp': 1563348228240,
	'traceId': '4822xxxxxxxxxxxxxxd54'
}

這種嵌套關係,在python中,也可以看做是,字典裏面嵌套了字典。
爲了後續的Excel導出,首先需要解除這種嵌套關係。

【方法1】直接將嵌套的json提取出來

比如,如果你需要的只是data部分,
那麼通過列表表達式,將data部分提取出來就行了。

data_json_arr = [j['data'] for j in json_arr]

【方法2】只將有用的鍵值對提取出來

加載jsonpath模塊,如果沒有可以通過pip install jsonpath安裝。
使用jsonpath.jsonpath(json,'$..key')[0],不管json有多少層,只要輸入鍵值都能取到。
返回值是列表,所以用[0]取出列表中的值。
(注意:上述是假設json嵌套中所有鍵名稱不重複;如果重複,jsonpath返回的列表可能不止一個值,注意自行調整優化)

from jsonpath import jsonpath as jp
keys = ['msg','appKey','deviceType']
data_json_arr = [{k:jp(j,'$..'+k)[0] for k in keys} for j in json_arr ]

【方法3】將json全部展開成一層

構造函數,將子json的鍵名稱與上層鍵名稱拼接,將json展開成一層

def HtmlJson(var):
    ''' 多層json展開變成一層

        requests請求返回的json往往是複雜嵌套關係,我們將所有嵌套層展開變成單層
        例如:
        {'a':1,
        'b':{'x':11,
            'y':12},
        'c':2}
        變成
        {'a':1,'b_x':11,'b_y':12,'c':2}

    Args:
        var: json格式變量或字符串
    '''
    if isinstance(var, str):        # 檢查變量類型
        j = json.loads(var)         # 字符串 到 json
    else:
        j = var

    while 1:
        nomix = True
        for k in list(j.keys()):
            if isinstance(j[k], dict):
                for kk in list(j[k].keys()):
                    j[k+'_'+kk] = j[k][kk]
                del j[k]
                nomix = False
        if nomix:
            break
    return j

不論什麼json,直接用該方法全都展開成一層就完事了。

data_json_arr = [HtmlJson(j) for j in json_arr]

最終得到沒有嵌套關係的json數據列表

data_json_arr列本中,每條json數據不再具有嵌套關係

{
	'code': 200,
	'msg': 'ok',
	'timestamp': 1563348228240,
	'traceId': '4822xxxxxxxxxxxxxxd54',
	'data_logId': '5a8795xxxxxxxxxxxxxxxxc15631',
	'data_errorClass': 1,
	'data_appKey': '527xxxxxxxxxxxxd000067',
	'data_appVersion': 'xxx',
	'data_channel': 'baidu',
	'data_deviceType': 'vivo X9s',
	'data_deviceVersion': None,
	'data_arch': 'AArch64 Processor rev 0 (aarch64)',
	'data_appPackageName': 'xxx.xxx.android',
	'data_os': 'android',
	'data_osVersion': '8.1.0',
	'data_jailbroken': 'false',
	'data_disk': -1.0,
	'data_sddisk': -1.0,
	'data_mem': -1.0,
	'data_cpu': None,
	'data_battery': -1.0,
	'data_temp': -1.0,
	'data_clientTime': '2019-07-17 13:59:07',
	'data_serverTime': '2019-07-17 14:14:43',
	'data_stackMd5': '7663999xxxxxxxxxxxxxd0a14',
	'data_umid': None
}

2、將表項爲json串的列表轉換爲EXCEL表格

這一步就很簡單了,直接就能得到excel表格輸出

import pandas as pd
df = pd.DataFrame(data_json_arr)
df.to_excel("output.xlsx")

這樣數據就輸出到了excel中。

當然熟悉DataFrame操作的,
也可以直接通過操作DataFrame,剔除無用列、排序等,
或者將DataFrame轉換成多維列表矩陣,進行其他數據處理操作。

df = df.iloc[:, 0:-1]              # 剔除最後一列
nd_arr = np.array(df)              # 轉換爲np.ndarray()
final_list = nd_arr.tolist()       # 轉換爲list

到這裏就結束了

所實現的就是:
將具有相同格式的,不包含子嵌套的,一組json列表:

[
	{'code':200, 'msg':'ok', 'timestamp': 1563348228240,},
	{'code':200, 'msg':'ok', 'timestamp': 1563348229050,},
	{'code':200, 'msg':'ok', 'timestamp': 1563348236780,},
	{'code':200, 'msg':'ok', 'timestamp': 1563348245670,},]

轉換成excel輸出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章