python 模块之路 序列化 json pickle
python 序列化
序列化 : 字符串 bytes
序列: 列表 元祖 字符串 bytes
把其他数据类型 转换成字符串 bytes 序列化的过程
转换str
# dic = {'1':'2'} # print([str(dic),dic]) # print([str([1,2,3]),[1,2,3]])
为什么要把其他数据类型转换成字符串?
能够在网络上传输的只能是bytes
能够存储在文件里的只有bytes和str
# dic = {'小明':{'phone_num':123123123123,}} # ''' # 小明|电话|性别 # 小张|... # ''' # 字典 -> 字符串 -通过网络去传输-> 字符串 -> 字典 # 转字符串的过程 不就是数据类型的强制转换么?为什么要学个序列化模块? # 字符串 -> 字典 # str_dic = str([1,2,3]) # print(str_dic,type(str_dic)) # 文件中读出来的 网络上接收来的 # res = eval(str_dic) # print(res,type(res)) # eval 要谨慎的使用,用户的输入/网络上接收的数据/文件中的内容 # eval('import os;os.remove('c:')') # eval('import urllib;') # 你已知的代码 但是可能需要一些拼接 根据你自己的逻辑去做的拼接
#方法练习
# dic = {'key' : 'value','key2' : 'value2'} # import json # ret = json.dumps(dic) # 序列化 # print(dic,type(dic)) # print(ret,type(ret)) # res = json.loads(ret) # 反序列化 # print(res,type(res)) # 问题1
# dic = {1 : 'value',2 : 'value2'} # ret = json.dumps(dic) # 序列化 # print(dic,type(dic)) # print(ret,type(ret)) # # res = json.loads(ret) # 反序列化 # print(res,type(res)) # 问题2
# dic = {1 : [1,2,3],2 : (4,5,'aa')} # ret = json.dumps(dic) # 序列化 # print(dic,type(dic)) # print(ret,type(ret)) # res = json.loads(ret) # 反序列化 # print(res,type(res)) # 问题3
# s = {1,2,'aaa'} # json.dumps(s) # 问题4
# TypeError: keys must be a string # json.dumps({(1,2,3):123})
json模块
json在所有的语言之间都通用 : json序列化的数据 在python上序列化了 那在Java 中也可以反序列化
能够处理的数据类型是非常有限的 : 字符串 列表 字典 数学
字典中的key只能是字符串
后端语言 Java c c++ c#
前端语言 在网页上展示的
import json # dic = {'key' : 'value','key2' : 'value2'} # ret = json.dumps(dic) # 序列化 # with open('json_file','a') as f: # f.write(ret) # 从文件中读取字典 # with open('json_file','r') as f: # str_dic = f.read() # dic = json.loads(str_dic) # print(dic.keys()) # dump load 是直接操作文件的 # dic = {'key1' : 'value1','key2' : 'value2'} # with open('json_file','a') as f: # json.dump(dic,f) # with open('json_file','r') as f: # dic = json.load(f) # print(dic.keys()) # 问题5 不支持连续的存 取 # dic = {'key1' : 'value1','key2' : 'value2'} # with open('json_file','a') as f: # json.dump(dic,f) # json.dump(dic,f) # json.dump(dic,f) # with open('json_file','r') as f: # dic = json.load(f) # print(dic.keys()) # 需求 :就是想要把一个一个的字典放到文件中,再一个一个取出来??? # dic = {'key1' : 'value1','key2' : 'value2'} # # with open('json_file','a') as f: # str_dic = json.dumps(dic) # f.write(str_dic+'\n') # str_dic = json.dumps(dic) # f.write(str_dic + '\n') # str_dic = json.dumps(dic) # f.write(str_dic + '\n') # with open('json_file','r') as f: # for line in f: # dic = json.loads(line.strip()) # print(dic.keys()) # json # dumps loads # 在内存中做数据转换 : # dumps 数据类型 转成 字符串 序列化 # loads 字符串 转成 数据类型 反序列化 # dump load # 直接将数据类型写入文件,直接从文件中读出数据类型 # dump 数据类型 写入 文件 序列化 # load 文件 读出 数据类型 反序列化 # json是所有语言都通用的一种序列化格式 # 只支持 列表 字典 字符串 数字 # 字典的key必须是字符串 # dic = {'key':'你好'} # print(json.dumps(dic,ensure_ascii=False)) # import json # data = {'username':['李华','二愣子'],'sex':'male','age':16} # json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False) # print(json_dic2) # 存文件/传网络
import pickle
支持在python中几乎所有的数据类型
import pickle # 支持在python中几乎所有的数据类型 dic = {(1,2,3):{'a','b'},1:'abc'} # ret = pickle.dumps(dic) # print(ret)
#2. dumps 序列化的结果只能是字节 # print(pickle.loads(ret))
# 3.只能在python中使用
# 4.在和文件操作的时候,需要用rb wb的模式打开文件
# 5.可以多次dump 和 多次load
# dump # with open('pickle_file','wb') as f: # pickle.dump(dic,f)
# load # with open('pickle_file','rb') as f: # ret = pickle.load(f) # print(ret,type(ret))
# dic = {(1,2,3):{'a','b'},1:'abc'} # dic1 = {(1,2,3):{'a','b'},2:'abc'} # dic2 = {(1,2,3):{'a','b'},3:'abc'} # dic3 = {(1,2,3):{'a','b'},4:'abc'} # with open('pickle_file','wb') as f: # pickle.dump(dic, f) # pickle.dump(dic1, f) # pickle.dump(dic2, f) # pickle.dump(dic3, f)
# with open('pickle_file','rb') as f: # ret = pickle.load(f) # print(ret,type(ret)) # ret = pickle.load(f) # print(ret,type(ret)) # ret = pickle.load(f) # print(ret, type(ret)) # ret = pickle.load(f) # print(ret, type(ret)) # ret = pickle.load(f) # print(ret, type(ret))
with open('pickle_file','rb') as f: while True: try: ret = pickle.load(f) print(ret,type(ret)) except EOFError: break
继续加强学习整理