首页 > 代码库 > json与pickle
json与pickle
json
json是进行程序数据类型的序列化与反序列化的模块之一。利用它可以进行不同平台,不同程序下的数据交换或者是程序暂时保存数据的一种方法。下面看一看json的用法:
1 #json_序列化.py 2 import json 3 dic={ 4 "id":"123456", 5 "name":"Jack", 6 "country":"China" 7 } 8 date=json.dumps(dic) 9 with open("demo.txt","w") as f: 10 f.write(date) 11 12 #json_反序列化.py 13 import json 14 with open("demo.txt","r") as f: 15 dic1=json.loads(f.read()) 16 print(dic1["name"])
上面展示了两个文件的内容,第一个文件是将一个字典序列化成字符串(使用dumps()方法),然后写入一个文件(demo.txt)。第二个文件是将demo.txt中的内容读取出来,然后用loads()方法将其反序列化可以执行的那个字典对象,并且打印出字典的“name”的内容。
其实除了dumps()和loads()两个方法之外,json还有两个更简单的方法:dump()和load()。下面演示用法:
1 #json_序列化2.py 2 import json 3 dic={ 4 "id":"123456", 5 "name":"Jack", 6 "country":"China" 7 } 8 with open("demo.txt","w") as f: 9 date=json.dump(dic,f) 10 11 12 13 #json_反序列化2.py 14 import json 15 with open("demo.txt","r") as f: 16 dic1=json.load(f) 17 print(dic1["name"])
对比一下就知道,dump()和load()是将dumps()和loads()以及文件的读写操作进行的封装。
pickle
pickle同样拥有json的上述四种方法,并且用法一模一样,在这里我就不做演示。但是pickle的功能更加强大。json只能够序列化一些比较简单的数据对象,如列表,字典等等。而pickle则还可以序列化函数,类等复杂对象。
下面演示一下pickle怎样序列化和反序列化一个函数。
1 #pickle_序列化.py 2 import pickle 3 #定义函数hello 4 def hello(name): 5 print("hello",name) 6 #定义列表,把hello也存进去 7 dic1={ 8 "name":"Mark", 9 "func":hello 10 } 11 with open("demo.txt","wb") as f: 12 pickle.dump(dic1,f) 13 14 #pickle_反序列化.py 15 import pickle 16 ####################### 17 def hello(name): 18 print("hello",name) 19 ####################### 20 with open("demo.txt","rb")as f: 21 dic2=pickle.load(f) 22 dic2["func"]("Jack")
上面同样展示了两个文件的内容注意。要注意以下的问题:
1.当涉及到函数,类等的序列化和反序列化的时候,在打开文件的时候都要以二进制的形式打开,注意展示中的“wb”,“rb”
2.如果要使反序列化出来的函数可以再新文件里执行的话,必须要把前面定义好的函数的源代码复制到新文件里(注意pickle_反序列化.py中的两排#行内的内容),否则将无法运行,如果没有#号内的内容的话,程序会报错:AttributeError: Can‘t get attribute ‘hello‘ on <module ‘__main__‘ from ‘D:/Users/LENOVO/PycharmProjects/Myfirstflask/about_json反.py‘>
3.可以对复制过来的函数的源代码进行更改,只需要保证函数名与序列化时所用的函数名一致即可,更改后如果调用该函数,则按照更改后的函数执行(当然这种更改必须是有必要的)
作者:彭前超
时间:2017/6/13 19:45
json与pickle