文件中默认只能存字符串, 是不能存字典二进制这种特殊类型的数据的, 如果想把字典格式的数据存入到文件中, 需要转换一下数据类型
- data = {"Name":"XiaoMing","Age":22}
- f = open("test.txt","r+",encoding="utf-8")
- f.write(str(data)) // 把 data 转换成字符串类型
- f.close()
如果现在读取数据的话, 字符串肯定不能使用 data["Name"] 这样的形式来调取值, 所以还需要把字符串转换成字典格式
- f = open("test.txt","r+",encoding="utf-8")
- data = eval(f.read()) // 小技巧, 使用 eval 可以把字符串转换为字典格式
- f.close()
- print(data["Name"])
虽然上面的方式也能实现序列化与反序列化的效果, 但是我们还是推荐使用标准的方式来操作
- import json
- data = {"Name":"XiaoMing","Age":22}
- print(type(json.dumps(data))) // 此处为测试, 看一下 dumps 后的数据是什么类型
- f = open("test.txt","w",encoding="utf-8")
- f.write( json.dumps(data) ) // 使用 json.dumps 进行序列化
- f.close()
接下来看一下 json 的反序列化
- import json
- f = open("test.txt","r",encoding="utf-8")
- data = json.loads(f.read()) // 使用 json.loads 进行反序列化
- f.close()
- print(data["Name"])
小总结: json 只能处理一些简单的数据格式, 比如字典列表字符串等, 但是 json 在所有的语言上都是通用的, 比如用 python 的程序和 java 的程序进行交互, 就需要用到 json 来进行转换
那如果想要处理一些复杂的数据呢, 比如在字典中接收一个函数, 看一下例子:
- import pickle // 需要导入 pickle 模块
- def hello(name):
- print("name",name)
- data = {"Name":"XiaoMing","Age":22,"aa":hello} // 把函数的内存地址当做字典的值, 比作复杂一些的数据类型
- f = open("test.txt","wb") // 因为 pickle 后的数据是二进制类型, 所以打开模式要使用 "b"
- f.write(pickle.dumps(data))
- f.close()
- print(type(pickle.dumps(data))) // 最后打印 pickle.dumps 后的数据类型
pickle 反序列化
- import pickle
- def hello(name):
- print("name",name)
- f = open("test.txt","rb")
- data = pickle.loads(f.read()) //pickle.loads 为反序列化
- f.close()
- print(data["aa"]("bbb")) // 此处为函数的传参
小总结: pickle 只能再 python 本语言中使用, 不能跨语言使用
来源: http://www.bubuko.com/infodetail-2532841.html