python序列化-pickle与json

pickle与json序列化


  • 序列化解释
    • 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。-- 来源:百度百科
    • 通俗点讲,就是将内存中的数据保存到硬盘里以便以后调用。内存中的数据,程序结束、断电就丢失了。
    • 在pandas模块中,如果我们只想临时保存数据以便以后调用,我们可以使用to_pickle将DataFrame或Series保存为二进制文件,二进制文件读取速度往往快于其他格式;机器学习监督学习的模型训练通常需要耗费不少时间,我们可以将模型序列化保存到本地,便于以后调用;网络爬虫中,有的网页可能返回js字符串,我们可以用过json模块字符串反序列化,将其转为python字典类型,便于数据提取…

  • pickle与json
    • JSON 是一个文本序列化格式(它输出 unicode 文本,尽管在大多数时候它会接着以 utf-8 编码),而 pickle 是一个二进制序列化格式;
    • JSON是人类可读的,而pickle则不是;
    • JSON是可互操作的,并且在Python生态系统之外广泛使用,而pickle是特定于Python的;
    • 默认情况下,JSON只能表示Python内置类型的子集,而不能表示自定义类; pickle可以表示极其庞大的Python类型(其中许多是自动的,通过巧妙地使用Python的内省工具;复杂的案例可以通过实现特定的对象API来解决)。

  • 导入模块
    import json
    import pickle
    

  • pickle方法
    • pickle.dump
      将obj的pickled表示写入打开的文件对象 文件。

      ls = [1,2,3,4]
      with open('d:/桌面/data','wb') as f:
      	pickle.dump(ls, f)
      ``
      
    • pickle.dumps
      将对象的pickled表示作为bytes对象返回,而不是将其写入文件。

      ls = [1,2,3,4]
      pickle_ls = pickle.dumps(ls)
      print(pickle_ls)
      #out: b'\x80\x03]q\x00(K\x01K\x02K\x03e.'
      
    • pickle.load
      与dump方法相反地,从打开的文件对象 文件中读取pickle对象表示,并返回其中指定的重构对象层次结构。

      with open('d:/桌面/data','wb') as f:
      	ls = pickle.load(f)
      print(ls)
      #out: [1, 2, 3]
      
    • pickle.loads
      与dumps方法相反,loads从bytes对象读取pickle对象层次结构并返回其中指定的重构对象层次结构。

      ls = pickle.loads(pickle_ls)
      print(ls)
      #out: [1, 2, 3]
      

  • json
    • json本质是一个字符串,多个数据,逗号间隔。

    • 同pickle模块一样,json模块也拥有以上四种方法,其中load和dump方法面向文件对象。

    • js支持的数据格式:

      • 对象(字典):使用花括号
      • 数组(列表):使用方括号
      • 整形、浮点型、布尔类型还有null类型
      • 字符串类型(字符串必须要用双引号,不能用单引号)
    • json.dumps

      dic = {'姓名':'张三','年龄':25}
      json.dumps(dic)
      #out: '{"\\u59d3\\u540d": "\\u5f20\\u4e09", "\\u5e74\\u9f84": 25}'		默认是ascill编码
      
      '''ensure_ascii=False:显示中文;indent = 4:间隔美化'''
      json.dumps(dic,ensure_ascii=False,indent = 4)
      #out: '{\n    "姓名": "张三",\n    "年龄": 25\n}'
      
    • js.loads

      json_test = str({"姓名":"张三"})
      #out: "{'姓名': '张三'}"
      json.loads(json_test)
      #out: json.decoder.JSONDecodeError	js使用字符串都是双引号,单引号无法识别。
      
      json_test = json_test.replace("'",'"')		# 把单引号替换成双引号
      json.loads(json_test)		# 我们再试一次
      #out: {'姓名': '张三'}	成功转化为字典,没问题。
      
      json_str = '{"姓名":"张三"}'
      json.loads(json_str)
      #out: {'姓名': '张三'}	转化成了python的字典类型
      
    • json.load

      with open('a.js','r',encoding='utf-8') as f:
      	js_str = js.load(f)		#从文件中加载js对象转化为python数据类型。
      
      • json.dump
      with open('a.js','w',encoding='utf-8') as f:
      	json.dump(f,json)	# 把js数据写入f文件中。
      
    • json注意事项

      • json中使用字符串都是双引号引起来的,如果不是双引号,可以使用eval:能实现简单的字符串和python类型的转化。或可以利用字符串replace方法替换下引号(如上)。eval函数:将字符串解析成表达式运算并返回。
      d = {'姓名':'张三','年龄':18}
      s = str(d)
      print(s)
      #out: "{'姓名': '张三', '年龄': 18}"		变成了字符串,引号不符合js规范
      print(eval(s))
      #out: {'姓名': '张三', '年龄': 18}		使用eval函数将字符串转化成字典
      
      • 往一个文件中写入多个json串,不再是一个json串,不能直接读取;可以一行写一个json串,按照行来读取。
      • jsonloads读取报错时,先将json字符串写入到本地,再查看原因(比如引号问题,js字符串前面还有其他需要去除的多余字符等)。
    • 分享一个js、xml解析网站,可以清晰地查看其结构
      JS、XML解析——点我

你可能感兴趣的:(Python)