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)
来源: https://www.cnblogs.com/index-01/p/12748952.html