zoukankan      html  css  js  c++  java
  • 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": ["javau722cu866bu6293u53d6qqu7fa4u6570u636e"], "reply": ["4"], "author": ["zzy64421"]},
    3. {"title": ["u6709u5927u795eu6709P2Pu7684u6570u636eu5417"], "reply": ["1"], "author": ["u6709u70b9u5c0fu538cu4e16"]},
    4. {"title": ["u60f3u722cu8d76u96c6u7f51uff0cu8bbfu95eeu592au5febu8981u8f93u9a8cu8bc1u7801uff0cu600eu4e48u7834"], "reply": ["7"], "author": ["u94c1u8840u591cu5e1d"]},
    5. {"title": ["30u5143u6c42u5199u4e00u7f51u9875u722cu866b"], "reply": ["4"], "author": ["Cu8c6ay"]},
    6. {"title": ["u767eu5ea6u8d34u5427u4e2du7684u697cu5c42u56deu590du600eu4e48u83b7u53d6u5462"], "reply": ["21"], "author": ["u5c0fu50bbu86cbu5a03u5a03"]},
    7. {"title": ["u6c42u52a9u7f8eu56e2u5916u5356u7684u722cu866bu6570u636e"], "reply": ["0"], "author": ["u5de6u4ed3u871cu67d1"]},
    8. {"title": ["u6709u6ca1u6709u9700u8981u5e2eu5fd9u722cu53d6u6570u636eu7684uff1fu6216u8005u505au722cu866bu7c7bu8bfeu9898u7684uff1fu57fau4e8eJAVA"], "reply": ["51"], "author": ["fhg1225"]},
    9. {"title": ["u6c42u53efu4ee5u722c58u540cu57ceuff0cu8d76u96c6u7f51u6570u636eu7684u722cu866bu3002"], "reply": ["9"], "author": ["200901491"]},
    10. {"title": ["u6709u722cu866bu8f6fu4ef6u53efu4ee5u91c7u96c6u5faeu535au3001u8d34u5427u3001u77e5u4e4eu7684u4e48uff1f"], "reply": ["3"], "author": ["u738bu9053u653bu7565"]}
    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中一定注意这一点




  • 相关阅读:
    Elasticsearch Query DSL 整理总结(三)—— Match Phrase Query 和 Match Phrase Prefix Query
    Elasticsearch Query DSL 整理总结(二)—— 要搞懂 Match Query,看这篇就够了
    Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述
    Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries
    Elasticsearch date 类型详解
    python 历险记(五)— python 中的模块
    python 历险记(四)— python 中常用的 json 操作
    python 历险记(三)— python 的常用文件操作
    Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI
    Elasticsearch Java Rest Client API 整理总结 (一)——Document API
  • 原文地址:https://www.cnblogs.com/wumingxiaoyao/p/7047779.html
Copyright © 2011-2022 走看看