zoukankan      html  css  js  c++  java
  • json and pickle 序列化

    前言

    文件只能存储字符串、二进制,若把内存的数据对象存到硬盘   从硬盘里读取数据,里面不止是字符串的类型,因此用到了json and pickle 序列化

    json序列化

    作用:用于不同语言进行的数据交互,json默认只能处理简单化的数据类型:字典、列表、字符串。为何只能处理简单的数据类型?因为java里的类和pyhton的类完全不一样,定义、特性等

    文件只能存储字符串、二进制,例如将数据字典的数据类型写入文件,报错

    按之前学过的知识对文件序列化

     1 info = {
     2     "name":"Mike",
     3     "age":16
     4 }
     5 f = open("json1","w",encoding = "utf-8")
     6 f.write(info)
     7 f.close()
     8 结果:
     9 Traceback (most recent call last):
    10   File "E:/python_3.5/second/json模块/json1.py", line 6, in <module>
    11     f.write(info)
    12 TypeError: write() argument must be str, not dict

    数据类型为字符串已存入文件

    1 info = {
    2     "name":"Mike",
    3     "age":16
    4 }
    5 f = open("json1","w",encoding = "utf-8")
    6 f.write(str(info))
    7 f.close()
    8 写入的json1文件
    9 {'age': 16, 'name': 'Mike'}

    用json.dumps()序列化

     1 import json
     2 info = {
     3     "name":"Mike",
     4     "age":16
     5 }
     6 f = open("json1","w",encoding = "utf-8")
     7 #print(json.dumps(info))  #结果{"age": 16, "name": "Mike"}
     8 f.write(json.dumps(info))
     9 
    10 写入文件
    11 {"age": 16, "name": "Mike"}

     json.dump()序列化

    不用写f.write()  将文件句柄传入

     1 import json
     2 info = {
     3     "name":"Mike",
     4     "age":16,
     5     #"fun":sayhi
     6 }
     7 
     8 f = open("json1","w",encoding = "utf-8”)
     9 json.dump(info,f)
    10 
    11 写入文件:
    12 {"age": 16, "name": "Mike"}

    json.loads()反序列化

    按之前学过的知识对文件反序列化

    1 f = open("json1","r",encoding = "utf-8")
    2 data = eval(f.read())
    3 print(data)
    4 print(data["age"])
    5 
    6 结果:
    7 {'age': 16, 'name': 'Mike'}
    8 16

    用json反序列化读取文件

    1 import json
    2 f = open("json1","r",encoding = "utf-8")
    3 data = json.loads(f.read())
    4 print(data["age"])
    5 结果
    6 16

    json.load()反序列化

    1 import json
    2 f = open("json1","r")
    3 # data = pickle.loads(f.read())
    4 print(json.load(f))
    5 
    6 结果:
    7 {'age': 16, 'name': 'Mike'}

     

    pickle.dumps() 序列化

    pickle只有在Python本语言里使用,java不认识pickle数据类型,只认识json数据类型

    pickle可以序列化python里的所有数据类型

     1 import pickle
     2 def sayhi():
     3     print("hello")
     4 info = {
     5     "name":"Mike",
     6     "age":16,
     7     "fun":sayhi
     8 }
     9 
    10 f = open("json1","wb")
    11 f.write(pickle.dumps(info))

    写入的文件

    注意:

    pickle.loads() 反序列化

     1 import pickle
     2 def sayhi():
     3     print("hello") #为何这里要再写一遍,在序列化时程序结束函数的内存地址已经被释放了 已找不到
     4 
     5 f = open("json1","rb")
     6 data = pickle.loads(f.read())
     7 print(data["age"])
     8 print(data)
     9 结果:
    10 16
    11 {'name': 'Mike', 'fun': <function sayhi at 0x005D2FA8>, 'age': 16}
  • 相关阅读:
    【实战】如何实现滚轮时间的显示
    NSDate的常用用法
    UIDatePicker的简单用法
    NSDateFormatter相关整理
    UIPickerView
    回家任务
    addTarget:self 的意思是说,这个方法在本类中
    2020/2/25
    树上启发式合并
    题解
  • 原文地址:https://www.cnblogs.com/wengxq/p/6986736.html
Copyright © 2011-2022 走看看