python基礎-json、pickle模塊

json、pickle區別

總結:

"""
json:
1.不是全部的數據類型否能夠序列化,序列化返回結果爲字符串
2.不能屢次對同一文件序列化
3.json數據能夠跨語言

pickle:
1.全部python數據類型均可以序列化,結果爲字節串
2.能夠屢次對同一文件序列化
3.不能跨語言(只python)
"""

json

  • 序列化:將內存中的數據,轉換成字節串,用以保存在文件或者網絡傳輸,稱爲序列化過程java

  • 反序列化:從文件中\網絡中獲取的數據,轉換成內存中原來的數據類型,成爲反序列化過程python

"""
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)
相關文章
相關標籤/搜索