Python 3 操作json 檔案

微微微笑發表於2017-11-20

背景

json 是一種輕量級的資料交換格式。易於人閱讀和編寫,同時也易於機器解析和生成。

一般表現形式是一個無序的 鍵值對 的集合。

資料:

官方文件: https://docs.python.org/3/library/json.html#module-json

python操作json的其他方式:

編碼(dump)

1. 將字串轉化為json串(dumps)

import json

a="\"foo\bar"
result=json.dumps(a)
print(result)
print(type(result))

執行結果:

"\"foo\bar"
<class 'str'>

2. 將列表轉化為json串(dumps)

import json

a=['foo', {'bar': ('baz', None, 1.0, 2)}]
result=json.dumps(a)
print(result)
print(type(result))

執行結果:

["foo", {"bar": ["baz", null, 1.0, 2]}]
<class 'str'>

3. 將字典轉化為json串(dumps)

import json

a={"c": 0, "b": 0, "a": 0}
result=json.dumps(a)
print(result)
print(type(result))

執行結果:

{"c": 0, "b": 0, "a": 0}
<class 'str'>

4. 轉化字典為json串時,進行排序(dumps)

import json

a={"c": 0, "b": 0, "a": 0}
result=json.dumps(a, sort_keys=True)
print(result)

執行結果:

{"a": 0, "b": 0, "c": 0}

對照上一個例子,可以看到json串按照字典的key進行了排序。

5. 定義json串縮排(dumps)

import json

a=[1,2,3,{'4': 5, '6': 7}]
result=json.dumps(a, indent=4)
print(result)

執行結果:

[
    1,
    2,
    3,
    {
        "6": 7,
        "4": 5
    }
]

可以看到json串輸出時採用了定義的4個空格進行縮排。

6. 將產生的json串輸出到檔案流(dump)

import json

myfile=open('a.txt','w')

a=[1,2,3,{'4': 5, '6': 7}]
json.dump(a,myfile, indent=4)

myfile.close()

執行之後,開啟 a.txt 檔案進行檢視:

[
    1,
    2,
    3,
    {
        "6": 7,
        "4": 5
    }
]

解碼(load)

1. 將json串解碼為列表(loads)

import json

json_str='["foo", {"bar":["baz", null, 1.0, 2]}]'
result=json.loads(json_str)
print(result)
print(type(result))

執行結果:

['foo', {'bar': ['baz', None, 1.0, 2]}]
<class 'list'>

可以看到,這裡講json串解碼為一個list。

2. 將json串解碼為字典(loads)

import json

json_str='{"a": 0, "b": 0, "c": 0}'
result=json.loads(json_str)
print(result)
print(type(result))

執行結果:

{'a': 0, 'c': 0, 'b': 0}
<class 'dict'>

3. 從檔案流解碼json串(load)

以上面dump生成的a.txt為例。

import json

myfile=open("a.txt",'r')

# json_str='{"a": 0, "b": 0, "c": 0}'
result=json.load(myfile)
print(result)
print(type(result))

myfile.close()

執行結果:

[1, 2, 3, {'6': 7, '4': 5}]
<class 'list'>

可以看到成功將a.txt的內容解碼為list。

其他

1. dumps 和 dump 的區別

下面是兩個函式的定義:

dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,allow_nan=True, cls=None, indent=None, separators=None,default=None, sort_keys=False, **kw)

dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,allow_nan=True, cls=None, indent=None, separators=None,default=None, sort_keys=False, **kw)

可以看到,dump比 dumps多了一個引數 fp。

dumps 會直接將生成的 json串 返回,也就是可以採取 json_str=dumps()的方式來獲取結果。

但是 dump 沒有返回值,它會將生成的 json串 輸出到 fp 流中。

2. loads 和 load 的區別

下面是兩個函式的定義:

load(fp, cls=None, object_hook=None, parse_float=None,parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

loads(s, encoding=None, cls=None, object_hook=None, parse_float=None,parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

可以看到 load 的前兩個引數是 fp 以及 cls,而 loads 的前兩個引數是 s 和 encoding。

loads 會將 json串直接進行解碼輸出。

load 是從 fp 檔案流中讀取json串,然後進行解碼輸出。本質load函式定義的時候還是呼叫的 load函式。

3. 抓取請求,並解析json內容

這裡採用的是python 的 requests 庫進行抓取。

import json
import requests

r=requests.get('http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=%E9%93%B6%E9%AD%82&bk_length=600')
print(type(r.text))

json_str=r.text
result=json.loads(json_str)
print(result)
print(type(result))

if result['id']==26096:
    print("success")
else:
    print("fail")

執行結果如下:

<class 'str'>
{'imageWidth': 512, 'totalUrl': 'http://baike.baidu.com/view/26096.htm', 'card': [{'name': '中文名', 'format': ['銀魂'], 'key': 'm21_bookname', 'value': ['銀魂']}], 'key': '銀魂', 'id': 26096, 'isSummaryPic': 'y', 'hasOther': 1, ……<class 'dict'>
success

這裡首先採用request.get 抓取json網頁,然後對 r.text 網頁內容進行解析。如果網頁內容 id 值為 26096的話,這裡就列印success。

備註:當然,這裡也可以直接使用 r.json()進行json解析。

相關文章