Json & pickle 数据序列化
Posted Zoe233
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Json & pickle 数据序列化相关的知识,希望对你有一定的参考价值。
前提:
文本文件中只能写入字符串或ascii码格式的内容。
info={\'name\':\'zoe\',\'age\':18} f=open(\'test.txt\',\'w\') f.write(info) #在文本文件中写入字典格式的内容,执行会报错。 f.closed()
变通方式将 f.write(info) 改为 f.write(str(info))。
但是这种写法比较低端。
同时,将文件通过open()读取到环境中,读取进来的还是字符串格式的。上面的操作是序列化,读取文件后的操作时反序列化。
f=open(\'test.txt\',\'r\') data=f.read() print(type(data)) #返回class \'str\' #想要保留数据的原本的格式,还需要将数据转化。 data_new=eval(data) print(type(data_new)) print(data_new)
返回:
但是上面的序列化和反序列化的方式不是常规的用法。只是在我们不了解序列化模块json,pickle的时候的用法。接下来我们介绍用于序列化的两个模块。
用于序列化的两个模块
- json,用于字符串 和 python数据类型间进行转换
- pickle,用于python特有的类型 和 python的数据类型间进行转换
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
json
实例1:
import json info={\'name\':\'zoe\',\'age\':18} f=open(\'test.txt\',\'w\') f.write(json.dumps(info)) #序列化。将info转换为字符串,写入文本文件中 f.close()
import json f=open(\'test.txt\',\'r\') data=json.loads(f.read()) #反序列化。用loads方法将字符串 print(data(type)) f.close()
实例2:
>>> import json >>> def sayhi(name): print(\'hello,\',name) >>> info={\'name\':\'zoe\',\'age\':18,\'func\':sayhi} >>> f=open(\'test.txt\',\'w\') >>> f.write(json.dumps(info)) #函数sayhi的内存地址不是json可以序列化的参数。 Traceback (most recent call last): File "<pyshell#12>", line 1, in <module> f.write(json.dumps(info)) File "C:\\Users\\Zoe\\Anaconda3\\lib\\json\\__init__.py", line 230, in dumps return _default_encoder.encode(obj) File "C:\\Users\\Zoe\\Anaconda3\\lib\\json\\encoder.py", line 198, in encode chunks = self.iterencode(o, _one_shot=True) File "C:\\Users\\Zoe\\Anaconda3\\lib\\json\\encoder.py", line 256, in iterencode return _iterencode(o, 0) File "C:\\Users\\Zoe\\Anaconda3\\lib\\json\\encoder.py", line 179, in default raise TypeError(repr(o) + " is not JSON serializable") TypeError: <function sayhi at 0x000000000317F8C8> is not JSON serializable
所以,json只能支持简单的数据类型,如字典,列表,字符串等。——
json主要用于不同的语言之间进行数据交互。比方说java和python之间的字典的交互,类,函数等复杂的json是无法进行处理,在不同语言之间进行交互。
xml主要在不同的语言和程序之间进行数据交互,是一种标记式的语言,正在逐渐被json给取代。因为json更简洁,更清晰。json是目前主流的在不同语言之间进行数据交互的模块。
json只能处理简单的,而pickle是用来处理复杂的数据类型。
json和pickle的操作和json一模一样。
pickle
实例1:
import pickle def sayhi(name): print(\'hello,\',name) info={\'name\':\'zoe\',\'age\':18,\'func\':sayhi} f=open(\'test.txt\',\'wb\') #以二进制方式写入文件 f.write(pickle.dumps(info)) #pickle.dump(info,f)完全等价 f.close()
反序列化:
import pickle def sayhi(name): print(\'hello world\',name) f=open(\'test.txt\',\'rb\') a=pickle.loads(f.read()) #完全等价于pickle.load(f) print(a) a[\'func\'](\'zoe\') \'\'\'如果反序列化中程序中没有sayhi()函数,则会报错。然而,在程序中有定义的同名的sayhi()函数即可读取并调用。 两个程序之间的内存地址是不能互相访问的,所以在函数序列化中, pickle只能在python中使用。\'\'\'
小知识:
json和pickle在文件写入过程中dumps两次,会写入两次;
json和pickle在文件中loads,在3.x中只能loads一次。
在2.x中第一次dump的,可以第一次loads。但是这个不好。
所以对于同一个文件的写入和读取记住只dump一次,load一次。如果想要每个都要dump一次,则dump成不同的文件。
以上是关于Json & pickle 数据序列化的主要内容,如果未能解决你的问题,请参考以下文章
python序列化: json & pickle & shelve 模块
python序列化: json & pickle & shelve 模块