python基础-json、pickle模块
我是dev小白 人气:0json、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)
加载全部内容