python基礎-json、pickle模組
json、pickle區別
總結:
"""
json:
1.不是所有的數據類型否可以序列化,序列化返回結果為字元串
2.不能多次對同一文件序列化
3.json數據可以跨語言
pickle:
1.所有python數據類型都可以序列化,結果為位元組串
2.可以多次對同一文件序列化
3.不能跨語言(只python)
"""
json
-
序列化:將記憶體中的數據,轉換成位元組串,用以保存在文件或者網路傳輸,稱為序列化過程
-
反序列化:從文件中\網路中獲取的數據,轉換成記憶體中原來的數據類型,成為反序列化過程
"""
json模組
java腳本對象標記語言
把所有的東西都轉換成字元串格式
"""
import json
# 序列化:將數據轉換為字元串,用以存儲或者網路傳輸
# dumps:從記憶體到記憶體
res = json.dumps(10)
print(res) # "10"
# 元組進行json轉換後,會轉換為列表
res = json.dumps((1, 2, 3))
print(res) # "[1, 2, 3]"
lst = json.loads(res)
print(type(lst)) # <class 'list'>
print(lst) # [1, 2, 3]
res = json.dumps([1, 2, 3, 4])
print(res) # "[1, 2, 3, 4]"
res = json.dumps({"name":"張三", "age": 20})
print(res) # "{"name": "\u5f20\u4e09", "age": 20}"
# set不能轉換成json字元串
# res = json.dumps(set("abc"))
# print(res) # TypeError: Object of type 'set' is not JSON serializable
# tup1 = (1, 2, 3)
# # print(set(tup1))
# res = json.dumps(set(tup1))
# print(res)
# dump:從記憶體到外邊 寫入到文件使用dump
# dic = {"name":"張三", "age": 20}
# with open("aa.txt", encoding="utf-8", mode="at") as f:
# # json.dump([1, 2, 3], f) # 把列錶轉換為json字元串,然後寫入文件
# json.dump(dic, f)
# 反序列化:把json字元串轉換成記憶體中存儲的數據類型,如:列表,字元串,字典
# 元組進行json轉換後,再次反序列化後顯示結果為:列表
# res = json.dumps((1, 2, 3))
# print(res) # "[1, 2, 3]"
# lst = json.loads(res)
# print(type(lst)) # <class 'list'>
# print(lst) # [1, 2, 3]
# 從文件中反序列化
# with open("aa.txt", encoding="utf-8") as f1:
# res = json.load(f1) # 不能一次反序列化多次序列化的數據
# print(type(res))
# print(res)
# 記憶體中寫入數據
with open("json.str", mode="at", encoding="utf-8") as f:
f.write(json.dumps([1, 2, 3]) + "\n")
f.write(json.dumps({"name":"張三", "age":18}) + "\n")
# 從文件中讀取數據,轉換為記憶體中存儲的數據類型
with open("json.str", encoding="utf-8") as f1:
# res = json.loads(f1.readline().strip())
# print(res)
#
# res = json.loads(f1.readline().strip())
# print(res)
for i in f1:
print(json.loads(i.strip()))
pickle
"""
pickle
序列化:可以把python的所有數據類型轉換為位元組串,
反序列化:將位元組串轉換為python中的數據類型
常用場景:和json一樣,一次性讀取,一次寫入
"""
import pickle
# 序列化元組
byts = pickle.dumps((1,2,3))
print(byts) # b'\x80\x03K\x01K\x02K\x03\x87q\x00.'
# 反序列化元組
res = pickle.loads(byts)
print(res) # (1, 2, 3)
# 序列化集合
byts = pickle.dumps(set("abc"))
print(byts) # b'\x80\x03cbuiltins\nset\nq\x00]q\x01(X\x01\x00\x00\x00aq\x02X\x01\x00\x00\x00bq\x03X\x01\x00\x00\x00cq\x04e\x85q\x05Rq\x06.'
# 反序列化集合
res = pickle.loads(byts)
print(res) # {'a', 'b', 'c'}
# 使用pickle寫入文件 二進位不能指定utf-8編碼
with open("pickle.str", mode="ab") as f:
pickle.dump(set("abcd"), f)
pickle.dump({"name":"張三", "age":18}, f)
with open("pickle.str", mode="rb") as f1:
for i in range(2):
res = pickle.load(f1)
print(res)