json 和 pickle

Posted 无名小妖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了json 和 pickle相关的知识,希望对你有一定的参考价值。

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的小例子:

  1. import requests
  2. import json
  3. response = requests.get(\'http://wthrcdn.etouch.cn/weather_mini?city=北京\')
  4. response.encoding = \'utf-8\'
  5. dic = json.loads(response.text)
  6. print(type(dic))
  7. print(dic)
  8. print(dic[\'data\'][\'city\'])
输出截图:
 这是数据在内存时的处理,我们在看一个数据在文件的处理:
数据在文件内的存储格式:
  1. [
  2. {"title": ["java\\u722c\\u866b\\u6293\\u53d6qq\\u7fa4\\u6570\\u636e"], "reply": ["4"], "author": ["zzy64421"]},
  3. {"title": ["\\u6709\\u5927\\u795e\\u6709P2P\\u7684\\u6570\\u636e\\u5417"], "reply": ["1"], "author": ["\\u6709\\u70b9\\u5c0f\\u538c\\u4e16"]},
  4. {"title": ["\\u60f3\\u722c\\u8d76\\u96c6\\u7f51\\uff0c\\u8bbf\\u95ee\\u592a\\u5feb\\u8981\\u8f93\\u9a8c\\u8bc1\\u7801\\uff0c\\u600e\\u4e48\\u7834"], "reply": ["7"], "author": ["\\u94c1\\u8840\\u591c\\u5e1d"]},
  5. {"title": ["30\\u5143\\u6c42\\u5199\\u4e00\\u7f51\\u9875\\u722c\\u866b"], "reply": ["4"], "author": ["C\\u8c6ay"]},
  6. {"title": ["\\u767e\\u5ea6\\u8d34\\u5427\\u4e2d\\u7684\\u697c\\u5c42\\u56de\\u590d\\u600e\\u4e48\\u83b7\\u53d6\\u5462"], "reply": ["21"], "author": ["\\u5c0f\\u50bb\\u86cb\\u5a03\\u5a03"]},
  7. {"title": ["\\u6c42\\u52a9\\u7f8e\\u56e2\\u5916\\u5356\\u7684\\u722c\\u866b\\u6570\\u636e"], "reply": ["0"], "author": ["\\u5de6\\u4ed3\\u871c\\u67d1"]},
  8. {"title": ["\\u6709\\u6ca1\\u6709\\u9700\\u8981\\u5e2e\\u5fd9\\u722c\\u53d6\\u6570\\u636e\\u7684\\uff1f\\u6216\\u8005\\u505a\\u722c\\u866b\\u7c7b\\u8bfe\\u9898\\u7684\\uff1f\\u57fa\\u4e8eJAVA"], "reply": ["51"], "author": ["fhg1225"]},
  9. {"title": ["\\u6c42\\u53ef\\u4ee5\\u722c58\\u540c\\u57ce\\uff0c\\u8d76\\u96c6\\u7f51\\u6570\\u636e\\u7684\\u722c\\u866b\\u3002"], "reply": ["9"], "author": ["200901491"]},
  10. {"title": ["\\u6709\\u722c\\u866b\\u8f6f\\u4ef6\\u53ef\\u4ee5\\u91c7\\u96c6\\u5fae\\u535a\\u3001\\u8d34\\u5427\\u3001\\u77e5\\u4e4e\\u7684\\u4e48\\uff1f"], "reply": ["3"], "author": ["\\u738b\\u9053\\u653b\\u7565"]}
  11. ]
整体来看这是个列表,列表内每个元素都是个字典。
  1. import json
  2. f = open(\'items.json\')
  3. a = json.load(f)
  4. print(type(a))
  5. print(a[0])
  6. print(a[0][\'author\'])
  7. f.close()
输出结果:

通过这两个例子我们看到了json的用法,也能体会出load和loads的区别了。 


【注】字符串内部必须使用双引号如:"reply": ["3"],不能写成:\'reply\': [\'3\']. 
因为json是跨语言的,其他语言是使用双引号表示字符串的,所以在python中一定注意这一点




以上是关于json 和 pickle的主要内容,如果未能解决你的问题,请参考以下文章

day5 常用模块json和pickle

json 和 pickle

pickle模块和json模块

python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)

python常用模块之json和pickle模块

模块调用,datetime,time,logging,递归,双层装饰器, json,pickle迭代器和生成器