• python接口测试之序列化与反序列化(四)


    在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式

    字符串解码为python数据对象。在python的标准库中,专门提供了json库与pickle库来处理这部分。

       先来学习json的库,导入json库很简单,直接import json,下面通过具体的实例来说明json库对序列化与反序列化的使用。json库的主要方法为:

    #!/usr/bin/env python
    #coding:utf-8
    
    import  json
    
    print json.__all__

    见json库的主要方法:

    ['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONEncoder']

    我们定义一个字典,通过json把它序列化为json格式的字符串,见实现的代码:

    复制代码
    #!/usr/bin/env python
    #coding:utf-8
    
    import  json
    
    dict1={'name':'wuya','age':22,'address':'xian'}
    
    print u'未序列化前的数据类型为:',type(dict1)
    print u'未序列化前的数据:',dict1
    #对dict1进行序列化的处理
    str1=json.dumps(dict1)
    print u'序列化后的数据类型为:',type(str1)
    print u'序列化后的数据为:',str1
    复制代码

    见如上的代码输出的内容:

    1
    2
    3
    4
    5
    6
    7
    C:Python27python.exe D:/git/Python/doc/index.py
    未序列化前的数据类型为: <type 'dict'>
    未序列化前的数据: {'age'22'name''wuya''address''xian'}
    序列化后的数据类型为: <type 'str'>
    序列化后的数据为: {"age"22"name""wuya""address""xian"}
     
    Process finished with exit code 0

    通过如上的代码以及结果可以看到,这就是一个序列化的过程,简单的说就是把python的数据类型转换为json格式的

    字符串。下来我们再反序列化,把json格式的字符串解码为python的数据对象,见实现的代码和输出:

    复制代码
    #!/usr/bin/env python
    #coding:utf-8
    
    import  json
    
    dict1={'name':'wuya','age':22,'address':'xian'}
    
    print u'未序列化前的数据类型为:',type(dict1)
    print u'未序列化前的数据:',dict1
    #对dict1进行序列化的处理
    str1=json.dumps(dict1)
    print u'序列化后的数据类型为:',type(str1)
    print u'序列化后的数据为:',str1
    #对str1进行反序列化
    dict2=json.loads(str1)
    print u'反序列化后的数据类型:',type(dict2)
    print u'反序列化后的数据:',dict2
    复制代码

    见输出结果的内容:

    复制代码
    C:Python27python.exe D:/git/Python/doc/index.py
    未序列化前的数据类型为: <type 'dict'>
    未序列化前的数据: {'age': 22, 'name': 'wuya', 'address': 'xian'}
    序列化后的数据类型为: <type 'str'>
    序列化后的数据为: {"age": 22, "name": "wuya", "address": "xian"}
    反序列化后的数据类型: <type 'dict'>
    反序列化后的数据: {u'age': 22, u'name': u'wuya', u'address': u'xian'}
    复制代码

    下面我们结合requests库,来看返回的json数据,具体代码为:

    复制代码
    #!/usr/bin/env python
    #coding:utf-8
    
    import  json
    import  requests
    
    r=requests.get('http://wthrcdn.etouch.cn/weather_mini?city=西安')
    
    print r.text,u'数据类型:',type(r.text)
    #对数据进行反序列化的操作
    dic=json.loads(r.text)
    print dic,u'数据类型:',type(dic)
    复制代码

    见输出的内容:

    复制代码
    C:Python27python.exe D:/git/Python/doc/index.py
    {"desc":"OK","status":1000,"data":{"wendu":"3","ganmao":"昼夜温差较大,较易发生感冒,请适当增减衣服。体质较弱的朋友请注意防护。","forecast":[{"fengxiang":"东北风","fengli":"微风级","high":"高温 10℃","type":"晴","low":"低温 -2℃","date":"22日星期四"},{"fengxiang":"东北风","fengli":"微风级","high":"高温 8℃","type":"多云","low":"低温 0℃","date":"23日星期五"},{"fengxiang":"东北风","fengli":"微风级","high":"高温 7℃","type":"阴","low":"低温 0℃","date":"24日星期六"},{"fengxiang":"东北风","fengli":"微风级","high":"高温 1℃","type":"雨夹雪","low":"低温 -1℃","date":"25日星期天"},{"fengxiang":"东北风","fengli":"微风级","high":"高温 5℃","type":"多云","low":"低温 1℃","date":"26日星期一"}],"yesterday":{"fl":"微风","fx":"北风","high":"高温 7℃","type":"阴","low":"低温 -1℃","date":"21日星期三"},"aqi":"87","city":"西安"}} 数据类型: <type 'unicode'>
    {u'status': 1000, u'data': {u'city': u'u897fu5b89', u'yesterday': {u'fx': u'u5317u98ce', u'type': u'u9634', u'high': u'u9ad8u6e29 7u2103', u'low': u'u4f4eu6e29 -1u2103', u'date': u'21u65e5u661fu671fu4e09', u'fl': u'u5faeu98ce'}, u'forecast': [{u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 10u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'22u65e5u661fu671fu56db', u'type': u'u6674', u'low': u'u4f4eu6e29 -2u2103'}, {u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 8u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'23u65e5u661fu671fu4e94', u'type': u'u591au4e91', u'low': u'u4f4eu6e29 0u2103'}, {u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 7u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'24u65e5u661fu671fu516d', u'type': u'u9634', u'low': u'u4f4eu6e29 0u2103'}, {u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 1u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'25u65e5u661fu671fu5929', u'type': u'u96e8u5939u96ea', u'low': u'u4f4eu6e29 -1u2103'}, {u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 5u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'26u65e5u661fu671fu4e00', u'type': u'u591au4e91', u'low': u'u4f4eu6e29 1u2103'}], u'ganmao': u'u663cu591cu6e29u5deeu8f83u5927uff0cu8f83u6613u53d1u751fu611fu5192uff0cu8bf7u9002u5f53u589eu51cfu8863u670du3002u4f53u8d28u8f83u5f31u7684u670bu53cbu8bf7u6ce8u610fu9632u62a4u3002', u'wendu': u'3', u'aqi': u'87'}, u'desc': u'OK'} 数据类型: <type 'dict'>
    
    Process finished with exit code 0
    复制代码

    事实上,在如上的代码中,我们可以不通过反序列化的操作,代码可以简化为:

    复制代码
    #!/usr/bin/env python
    #coding:utf-8
    
    import  json
    import  requests
    
    r=requests.get('http://wthrcdn.etouch.cn/weather_mini?city=西安')
    print r.json(),u'数据类型为:',type(r.json())
    复制代码

    见输出的内容:

    复制代码
    C:Python27python.exe D:/git/Python/doc/index.py
    {u'status': 1000, u'data': {u'city': u'u897fu5b89', u'yesterday': {u'fx': u'u5317u98ce', u'type': u'u9634', u'high': u'u9ad8u6e29 7u2103', u'low': u'u4f4eu6e29 -1u2103', u'date': u'21u65e5u661fu671fu4e09', u'fl': u'u5faeu98ce'}, u'forecast': [{u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 10u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'22u65e5u661fu671fu56db', u'type': u'u6674', u'low': u'u4f4eu6e29 -2u2103'}, {u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 8u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'23u65e5u661fu671fu4e94', u'type': u'u591au4e91', u'low': u'u4f4eu6e29 0u2103'}, {u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 7u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'24u65e5u661fu671fu516d', u'type': u'u9634', u'low': u'u4f4eu6e29 0u2103'}, {u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 1u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'25u65e5u661fu671fu5929', u'type': u'u96e8u5939u96ea', u'low': u'u4f4eu6e29 -1u2103'}, {u'fengxiang': u'u4e1cu5317u98ce', u'high': u'u9ad8u6e29 5u2103', u'fengli': u'u5faeu98ceu7ea7', u'date': u'26u65e5u661fu671fu4e00', u'type': u'u591au4e91', u'low': u'u4f4eu6e29 1u2103'}], u'ganmao': u'u663cu591cu6e29u5deeu8f83u5927uff0cu8f83u6613u53d1u751fu611fu5192uff0cu8bf7u9002u5f53u589eu51cfu8863u670du3002u4f53u8d28u8f83u5f31u7684u670bu53cbu8bf7u6ce8u610fu9632u62a4u3002', u'wendu': u'3', u'aqi': u'87'}, u'desc': u'OK'} 数据类型为: <type 'dict'>
    
    Process finished with exit code 0
    复制代码

    在实际的工作中,序列化或者反序列化的可能是一个文件的形式,不可能像如上写的那样简单的,下来就来实现这部分,把文件内容

    进行序列化和反序列化,先来看序列化的代码:

    复制代码
    #!/usr/bin/env python
    #coding:utf-8
    
    import  json
    
    
    list1=['selenium','appium','android','ios','uiautomator']
    #把list1先序列化,再写入到一个文件中
    print json.dump(list1,open('c:/log.log','w'))
    print u'文件内容为:'
    r=open('c:/log.log','r+')
    print r.read()
    复制代码

    见输出的内容:

    C:Python27python.exe D:/git/Python/doc/index.py
    None
    文件内容为:
    ["selenium", "appium", "android", "ios", "uiautomator"]
    
    Process finished with exit code 0

    下面我们来反序列化,也就是先读取文件里面的内容,再进行反序列化,见实现的代码:

    复制代码
    #!/usr/bin/env python
    #coding:utf-8
    
    import  json
    
    
    list1=['selenium','appium','android','ios','uiautomator']
    #把list1先序列化,再写入到一个文件中
    print json.dump(list1,open('c:/log.log','w'))
    print u'文件内容为:'
    r=open('c:/log.log','r+')
    print r.read()
    #先读取文件内容,再进行反序列化
    res=json.load(open('c:/log.log','r+'))
    print res,u'数据类型:',type(res)
    复制代码

    见输出的内容:

    复制代码
    C:Python27python.exe D:/git/Python/doc/index.py
    None
    文件内容为:
    ["selenium", "appium", "android", "ios", "uiautomator"]
    [u'selenium', u'appium', u'android', u'ios', u'uiautomator'] 数据类型: <type 'list'>
    
    Process finished with exit code 0
    复制代码

         下来来看pickle库,它提供的方法为:

    #!/usr/bin/env python
    #coding:utf-8
    
    import  pickle
    
    print pickle.__all__
    复制代码
    C:Python27python.exe D:/git/Python/doc/index.py
    ['PickleError', 'PicklingError', 'UnpicklingError', 'Pickler', 'Unpickler', 'dump', 'dumps', 'load', 'loads', 'APPEND', 'APPENDS', 'BINFLOAT', 'BINGET', 'BININT', 'BININT1', 'BININT2', 'BINPERSID', 'BINPUT', 'BINSTRING', 'BINUNICODE', 'BUILD', 'DICT', 'DUP', 'EMPTY_DICT', 'EMPTY_LIST', 'EMPTY_TUPLE', 'EXT1', 'EXT2', 'EXT4', 'FALSE', 'FLOAT', 'GET', 'GLOBAL', 'HIGHEST_PROTOCOL', 'INST', 'INT', 'LIST', 'LONG', 'LONG1', 'LONG4', 'LONG_BINGET', 'LONG_BINPUT', 'MARK', 'NEWFALSE', 'NEWOBJ', 'NEWTRUE', 'NONE', 'OBJ', 'PERSID', 'POP', 'POP_MARK', 'PROTO', 'PUT', 'REDUCE', 'SETITEM', 'SETITEMS', 'SHORT_BINSTRING', 'STOP', 'STRING', 'TRUE', 'TUPLE', 'TUPLE1', 'TUPLE2', 'TUPLE3', 'UNICODE']
    
    Process finished with exit code 0
    复制代码

    这里我们只关注pickle库的dump(),dumps(),load(),loads()方法,先来看序列化的代码:

    import  pickle
    
    dic={'name':'无涯','age':22,'address':'西安'}
    str1=pickle.dumps(dic)
    print str1,type(str1)

    见输出的内容:

    复制代码
    C:Python27python.exe D:/git/Python/doc/index.py
    (dp0
    S'age'
    p1
    I22
    sS'name'
    p2
    S'xe6x97xa0xe6xb6xaf'
    p3
    sS'address'
    p4
    S'xe8xa5xbfxe5xaex89'
    p5
    s. <type 'str'>
    复制代码

    输出的内容基本看不懂,但是可以看到数据格式是字符串,这是ASCII格式的数据,默认是ASCII格式保存对象,

    在进行序列化的使用,设置为True就是二进制保存对象,见实现的代码和输出内容:

    复制代码
    #!/usr/bin/env python
    #coding:utf-8
    
    import  pickle
    
    dic={'name':'无涯','age':22,'address':'西安'}
    str1=pickle.dumps(dic,True)
    print str1,type(str1)
    复制代码

    见输出的二进制的数据:

    C:Python27python.exe D:/git/Python/doc/index.py
    }q (UageqKUnameqU无涯qUaddressqU西安qu. <type 'str'>

    下面通过loads()方法来进行反序列化,见实现的代码:

    复制代码
    #!/usr/bin/env python
    #coding:utf-8
    
    import  pickle
    
    dic={'name':u'无涯','age':22,'address':u'西安'}
    #序列化
    str1=pickle.dumps(dic,True)
    print str1,type(str1)
    #反序列化
    dict1=pickle.loads(str1)
    print dict1,type(dict1)
    复制代码

    见输出的内容:

    C:Python27python.exe D:/git/Python/doc/index.py
    }q (UageqKUnameqX   无涯qUaddressqX   西安qu. <type 'str'>
    {'age': 22, 'name': u'u65e0u6daf', 'address': u'u897fu5b89'} <type 'dict'>

    下来我们通过对文件的形式来进行序列化和反序列化,见实现的代码:

    复制代码
    #!/usr/bin/env python
    #coding:utf-8
    
    import  pickle
    
    dic={'name':u'无涯','age':22,'address':u'西安'}
    #先序列化,然后写入到文件中
    pickle.dump(dic,open('c:/log.log','w'),True)
    print u'文件内容为:'
    print open('c:/log.log').read()
    #先读取文件,再反序列化
    d=pickle.load(open('c:/log.log','r+'))
    print u'反序列化后的数据与数据类型:',d,type(d)
    复制代码

    见输出的内容:

    C:Python27python.exe D:/git/Python/doc/index.py
    文件内容为:
    }q (UageqKUnameqX   无涯qUaddressqX   西安qu.
    反序列化后的数据与数据类型: {'age': 22, 'name': u'u65e0u6daf', 'address': u'u897fu5b89'} <type 'dict'>
    
    Process finished with exit code 0
  • 相关阅读:
    【Framework】HTTP运行期与页面执行模型
    【Framework】深入研究Asp.net页面的生命周期
    【WCF】Silverlight+wcf+自定义用户名密码验证
    【缓存】EF4ProviderWrappers
    【缓存】Sql Server 2005/2008 SqlCacheDependency查询通知的使用总结
    【缓存】利用Cache防止同一帐号重复登录
    【缓存】.net中Cache管理操作
    【缓存】系统缓存全解析 (上)
    【缓存】系统缓存全解析 (中)
    【缓存】系统缓存全解析 (下)
  • 原文地址:https://www.cnblogs.com/scarlett-hy/p/9369753.html
Copyright © 2020-2023  润新知