json 和 pickle
用于序列化的两个模块
json,用于字符串 和 python数据类型间进行转换
pickle,用于python特有的类型 和 python的数据类型间进行转换
json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
json dumps把数据类型转换成字符串
dump把数据类型转换成字符串并存储在文件中
loads把字符串转换成数据类型
load把文件打开从字符串转换成数据类型
可以看到直接对文件的操作都是不带“s” 的dump和load,直接对内存操作的都是带“s”的。
pickle同理
现在有个场景在不同设备之间进行数据交换很low的方式就是传文件,dumps可以直接把服务器A中内存的东西发给其他服务器,比如B服务器、
在很多场景下如果用pickle的话那A的和B的程序都的是python程序这个是不现实的,很多时候都是不同的程序之间的内存交换怎么办?就用到了json
并且json能dump的结果更可读,那么有人就问了,那还用pickle做什么不直接用json,是这样的,json只能把常用的数据类型序列化(列表、字典、列表、字符串、数字),像日期格式、类对象 json就不行了,只有用pickle。
为什么他不能序列化上面的东西呢?因为json是跨语言的!
我们看个json的小例子:
import requests
import json
response = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=北京')
response.encoding = 'utf-8'
dic = json.loads(response.text)
print(type(dic))
print(dic)
print(dic['data']['city'])
输出截图:
这是数据在内存时的处理,我们在看一个数据在文件的处理:
数据在文件内的存储格式:
[
{"title": ["javau722cu866bu6293u53d6qqu7fa4u6570u636e"], "reply": ["4"], "author": ["zzy64421"]},
{"title": ["u6709u5927u795eu6709P2Pu7684u6570u636eu5417"], "reply": ["1"], "author": ["u6709u70b9u5c0fu538cu4e16"]},
{"title": ["u60f3u722cu8d76u96c6u7f51uff0cu8bbfu95eeu592au5febu8981u8f93u9a8cu8bc1u7801uff0cu600eu4e48u7834"], "reply": ["7"], "author": ["u94c1u8840u591cu5e1d"]},
{"title": ["30u5143u6c42u5199u4e00u7f51u9875u722cu866b"], "reply": ["4"], "author": ["Cu8c6ay"]},
{"title": ["u767eu5ea6u8d34u5427u4e2du7684u697cu5c42u56deu590du600eu4e48u83b7u53d6u5462"], "reply": ["21"], "author": ["u5c0fu50bbu86cbu5a03u5a03"]},
{"title": ["u6c42u52a9u7f8eu56e2u5916u5356u7684u722cu866bu6570u636e"], "reply": ["0"], "author": ["u5de6u4ed3u871cu67d1"]},
{"title": ["u6709u6ca1u6709u9700u8981u5e2eu5fd9u722cu53d6u6570u636eu7684uff1fu6216u8005u505au722cu866bu7c7bu8bfeu9898u7684uff1fu57fau4e8eJAVA"], "reply": ["51"], "author": ["fhg1225"]},
{"title": ["u6c42u53efu4ee5u722c58u540cu57ceuff0cu8d76u96c6u7f51u6570u636eu7684u722cu866bu3002"], "reply": ["9"], "author": ["200901491"]},
{"title": ["u6709u722cu866bu8f6fu4ef6u53efu4ee5u91c7u96c6u5faeu535au3001u8d34u5427u3001u77e5u4e4eu7684u4e48uff1f"], "reply": ["3"], "author": ["u738bu9053u653bu7565"]}
]
整体来看这是个列表,列表内每个元素都是个字典。
import json
f = open('items.json')
a = json.load(f)
print(type(a))
print(a[0])
print(a[0]['author'])
f.close()
输出结果:
通过这两个例子我们看到了json的用法,也能体会出load和loads的区别了。
【注】字符串内部必须使用双引号如:"reply": ["3"],不能写成:'reply': ['3'].
因为json是跨语言的,其他语言是使用双引号表示字符串的,所以在python中一定注意这一点