Python学习之json序列化
一、什么是序列化
在我們存儲數(shù)據(jù)或者網(wǎng)絡(luò)傳輸數(shù)據(jù)的時候,需要對我們的對象進行處理,把對象處理成方便存儲和傳輸?shù)臄?shù)據(jù)格式。這個過程叫序列化,不同的序列化結(jié)果也不同,但目的是一樣的,都是為了存儲和傳輸
在Python中三種序列化的方案:
pickle,可以將我們Python中任意數(shù)據(jù)類型轉(zhuǎn)化為bytes并寫入到文件中。同樣也可以把文件中寫好的bytes轉(zhuǎn)換回到我們Python的數(shù)據(jù)-這個過程被稱為反序列化。
shelve簡單另類的一種序列化方案。有點類似于Redis,可以作為一種小型的數(shù)據(jù)庫來使用。
json,將Python中常見的字典,列表轉(zhuǎn)化成字符串,是目前前后端數(shù)據(jù)交互使用頻率最高的一種數(shù)據(jù)模式。
二、json
1.什么是json
json是前后端交互的樞紐,相當(dāng)于編程界的普通話,前后端用Python溝通。因為json的語法格式可以完美的表示出一個對象。那么什么是json:json全稱JavaScript object notation,即js對象簡譜,例如下面代碼示例:
{
"id": 1,
"title": "Python從入門到放棄(第二版)",
"pub_date": "2018-01-11",
"category": "Python",
"publisher": {
"id": 1,
"name": "北京出版社"
},
"post_authors": [
{
"id": 2,
"name": "佚名"
}
]
}
這段形如Python字典的東西在JavaScript里面叫json,其實是一樣的。我們發(fā)現(xiàn)用這樣的數(shù)據(jù)結(jié)構(gòu)可以完美的表示出任何對象,并且可以完整的把對象表示出來。只要代碼格式比較好,那么可讀性也挺強的,所以大家公認用這樣一種數(shù)據(jù)結(jié)構(gòu)作為數(shù)據(jù)交互的格式。
在json之前,通常用的數(shù)據(jù)結(jié)構(gòu)為XML,形如:
<?xml version="1.0" encoding="utf-8" ?>
<book>
<title>Python從入門到放棄(第二版)</title>
<pub_date>2018-01-11</pub_date>
<category>Python</category>
<publisher>
<id>1</id>
<name>北京出版社</name>
</publisher>
</book>
總之,XML格式的文件在維護和處理上相比json文件很難解析,所以后來大都傾向于使用json這一數(shù)據(jù)結(jié)構(gòu)了。
2.json在Python中的用法
字典 -> json
要先引入json模塊,再進行處理
import json
dic = {"姓名": "程序猿", "年齡": 28, "頭發(fā)": None}
s = json.dumps(dic)
print(s)
# 輸出:
>>>{"u59d3u540d": "u7a0bu5e8fu733f", "u5e74u9f84": 28, "u5934u53d1": null}
結(jié)果很不友好啊. 那如何處理成中?呢? 在dumps的時候給出另一個參數(shù)ensure_ascii=False就可以了了。
import json
dic = {"姓名": "程序猿", "年齡": 28, "頭發(fā)": None}
s = json.dumps(dic, ensure_ascii=False)
print(s)
# 輸出:
>>>{"姓名": "程序猿", "年齡": 28, "頭發(fā)": null}
json -> 字典
上面介紹的是如何把字典格式的數(shù)據(jù)轉(zhuǎn)化為json,那么怎么把前端傳遞過來的json文件轉(zhuǎn)化為字典格式呢:
import json
s = '{"姓名": "程序猿", "年齡": 28, "頭發(fā)": null}'
# 注意此處要加引號,表示s為字符串-the JSON object must be str
dic = json.loads(s)
print(dic)
print(type(dic))
# 輸出:
>>> {'姓名': '程序猿', '年齡': 28, '頭發(fā)': None}
>>> <class 'dict'>
寫入/讀取json文件
json也可以像pickle一樣把序列化的結(jié)果寫入到文件中:
import json
dic = {"姓名": "程序猿", "年齡": 28, "頭發(fā)": None}
f = open('test.json', mode='w', encoding="utf-8")
# 把對象打散成json寫入到文件中
json.dump(dic, f, ensure_ascii=False)
f.close()
test.json中顯示:
{
"姓名": "程序猿",
"年齡": 28,
"頭發(fā)": null
}
同樣也可以從文件中讀取一個json:
import json
f = open('test.json', mode='r', encoding="utf-8")
dic = json.load(f)
f.close()
print(dic)
# 輸出:
>>> {'姓名': '程序猿', '年齡': 28, '頭發(fā)': None}
注意: 我們可以向同一個文件中寫入多個json串,但是讀不行
import json
lst = [
{"a": 1},
{'b': 2},
{'c': 3}
]
f = open("test.json", mode="w", encoding="utf-8")
for dic in lst:
json.dump(dic, f)
f.close()
test.json中顯示:
?
可以看到此時文件中的內(nèi)容是一行的,所以會有紅色下劃線顯示報錯信息,這在讀取的時候是無法正常讀取的。如何解決讀取問題呢?兩種方案。
方案一:
把所有的內(nèi)容準(zhǔn)備好統(tǒng)一進行寫入和讀取,但是這樣處理,如果數(shù)據(jù)量小還好,數(shù)據(jù)量大的話就很麻煩了。
方案二:
不用dump方法,改用dumps和loads,對每一行分別進行處理。
import json
lst = [
{"a": 1},
{'b': 2},
{'c': 3}
]
# 寫入
f = open("test.json", mode="w", encoding="utf-8")
for dic in lst:
s = json.dumps(dic, ensure_ascii=True) + '
'
f.write(s)
f.close()
# 讀取
f = open("test.json", mode='r', encoding='utf-8')
for line in f:
d = json.loads(line.strip())
print(d)
f.close()
打印結(jié)果為:
{'a': 1}
{'b': 2}
{'c': 3}
這樣的話就能正常讀取了!
總結(jié)
以上是生活随笔為你收集整理的Python学习之json序列化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 湖南中烟怎么样 品味湖南特色烟草?
- 下一篇: 郑和徐怎么组成四字谐音网名