zoukankan      html  css  js  c++  java
  • json模块中的 dumps | loads dump | load ------- json 和 pickle 两个模块之间的区别

    # ### json
    """
    json 模块能够转化的数据类型如下: int float bool str list tuple dict None 8个数据类型可以序列化
    json数据类型的提出,是让不同的语言之间形成数据交流
    pickle返回的是二进制的字节流,它是用来进行数据的传输和存储的.
    
    json   序列化成一个字符串
    pickle 序列化成一个字节流
    """
    import json
    # dumps 和 loads 是一对,用来序列化和反序列化的,在字符串和其他数据类型之间切换
    dic = {'name':"黄文","age":8,"sex":"男性","family":['爸爸',"妈妈"]}
    # 序列化
    '''
    ensure_ascii=True 如果想要显示中文ensure_ascii = False 
    sort_keys=True 对字典的键进行排序(默认按照ascii 从小到大排序)
    '''
    res = json.dumps(dic,ensure_ascii=False,sort_keys=True)
    print(res,type(res))
    
    # 反序列化
    res = json.loads(res)
    print(res,type(res))
    
    
    # dump 和 load 是一对, 用来进行数据的存储和提取
    dic = {'name':"黄文","age":8,"sex":"男性","family":['爸爸',"妈妈"]}
    with open("ceshi001.json",mode="w",encoding="utf-8") as fp:
    	json.dump(dic,fp,ensure_ascii=False)
    
    with open("ceshi001.json",mode="r",encoding="utf-8") as fp:
    	res = json.load(fp)
    
    print(res,type(res))
    
    # ###json 和 pickle 两个模块之间的区别;
    # json
    '''
    可以连续dump,但是load只能一次性把所有数据拿出来进行反序列化,造成数据错误
    针对于这个弊端,可以使用loads来解决
    '''
    dic = {'a':1,"b":2}
    with open("ceshi002.json",mode="w",encoding="utf-8") as fp:
    	json.dump(dic,fp)
    	fp.write('
    ')
    	json.dump(dic,fp)
    	fp.write('
    ')
    
    print("<===>")
    with open("ceshi002.json",mode="r",encoding="utf-8") as fp:
    	# res = json.load(fp)  error
    	for  i in fp:
    		# 读一行,反序列化成一个字典,依次循环.
    		res = json.loads(i)
    		print(res,type(res))
    
    
    # pickle
    '''
    允许连续dump , 也允许连续load
    '''
    import pickle
    dic = {'a':3,"b":4}
    with open("ceshi003.pkl",mode="wb") as fp:
    	pickle.dump(dic,fp)
    	pickle.dump(dic,fp)
    	pickle.dump(dic,fp)
    	pickle.dump(dic,fp)
    
    with open("ceshi003.pkl",mode="rb") as fp:
    	'''
    	res = pickle.load(fp)
    	print(res)
    	res = pickle.load(fp)
    	print(res)
    	res = pickle.load(fp)
    	print(res)
    	res = pickle.load(fp)
    	print(res)
    	'''
    	# res = pickle.load(fp)
    	# print(res)
    
    	# 是否可以把所有数据都一次性拿出来?
    	# 用try ... except ..抑制多调用的那一次的报错.
    	try:
    		while True:
    			res = pickle.load(fp)
    			print(res)
    	except:
    		pass
    		
    '''
    # json 和 pickle 两个模块的区别:
    (1)json序列化之后的数据类型是str,所有编程语言都识别,
       但是仅限于(int float bool)(str list tuple dict None)
       json不能连续load,只能一次性拿出所有数据
    (2)pickle序列化之后的数据类型是bytes,
       所有数据类型都可转化,但仅限于python之间的存储传输.
       pickle可以连续load,多套数据放到同一个文件中
    '''
    

      

  • 相关阅读:
    【一个蒟蒻的挣扎】单源最短路(Dijkstra)
    【字符串大模拟】潜伏者—— NOIP2009原题
    【一个蒟蒻的挣扎】最长上升子序列
    【球的序列】——最长上升子序列
    【洛谷P1886】滑动窗口——单调队列
    【实时更新】你永远都不会想到上了考场会犯什么样的**错误——汇总
    【洛谷P1816】忠诚——ST表做法
    【一道来自老师的题的题解】equip——奇妙的最短路
    【洛谷P1119题解】灾后重建——(floyd)
    济南集训总结
  • 原文地址:https://www.cnblogs.com/huangjiangyong/p/10920485.html
Copyright © 2011-2022 走看看