美文网首页
day13、json数据、网络请求、异常 2019-01-09

day13、json数据、网络请求、异常 2019-01-09

作者: 绝世小丑 | 来源:发表于2019-01-09 19:16 被阅读0次

    一、复习

    1.打开文件 --> 操作文件 --> 关闭文件

    文件对象 = open(文件路径, 打开方式, encoding='utf-8')

    ./
    ././

    r, w, rb, wb, a

    with open(文件路径,打开方式,encoding='utf-8') as 文件对象

    2.文件对象.read() or 文件对象.readline()

    文件对象.write()

    3.数据持久化的方法

    需要使用数据的时候先从文件中读出来
    数据修改后,将最新的数据保存到文件中

    二、json

    1.什么是 json 数据

    json 是一种具有特定语法的数据格式。

    2.json 数据的语法

    一个 json 数据有且只有一个数据;这个数据的数据类型必须是 json 支持的数据类型。

    3.json 支持的数据类型

    a.数字类型(number):包括所有的数字;包括整数、小数,例如: 10 、 12.25 、 -20 等。

    注意:正数前面不能加 ‘+’,支持科学技术法(20e1)。

    b.字符串(string):使用双引号括起来的数据(只能是双引号);例如:"132……&*"、"ASDGVC@#$%"、"asdaffgd"。
    c.布尔(bool):只有 true 和 false 两个值(首字母小写)。
    d.数组(list):相当于python的列表,用[]括起来,多个元素用逗号隔开;例如:[123, "adc", [1, 2]]
    e.字典(dict):相当于python中的字典,用{}括起来,多个键值对用逗号隔开,例如:{"a": 1, "d": 2, "c": 3}
    f.空值(null):相当于python中的 None 。

    4.python处理 json 数据

    python 提供了 json 模块,专门用来处理 json 数据。

    1).将 json 数据转换成 python 数据:

    a.转换方式
    将 json 数据转换成 python 数据(通过爬虫获取到别人提供的 json 数据,在 python 中处理)
    json --> python
    数字 --> int/float
    字符串 --> str,可能双引号会变成单引号。
    布尔值 --> bool,会将 json 中的 true/false 转换成 True/False(首字母大写)。
    数组 --> list
    字典 --> dict
    空值(null) --> None

    b.loads 方法
    loads(字符串, encoding='utf-8') -----将字符串中的 json 数据转换成对应的 python 数据。
    注意:这里的字符串中的内容必须是 json 数据

    2).将 python 数据转换成 json 数据( python 写后台接口将数据提供给客户端):

    a.转换方式
    python --> json
    int/float --> 数字字符串
    str --> 字符串
    bool --> 布尔值,大写变小写
    list/tuple --> 数组
    dict --> 字典
    空值(None) --> null
    注意:集合不支持转换成 json 数据。

    b.dumps(对象) -----将指定的对象转换成 json 数据,以字符串的形式返回
    这里的对象指的就是 python 数据
    注意:返回值是字符串,并且字符串的内容是 json 内容。

    5.json 文件处理

    严格来说, json 文件是文件内容是 json 数据的文件。

    load(文件对象) -----将指定文件中的内容读出来,并且转换成 python 对应的内容。
    注意:这里的文件对象对应的文件必须是 json 文件。

    dump(对象, 文件对象) -----将指定的对象喜欢喝成内容是 json 格式的字符串,然后写入指定的文件中。
    注意:这里的对象对应的类型必须是能够转换成 json 的数据类型。
    例如:

    import json
    
    
    def main():
        # 将 python 中 的数据转换成 json 数据
        result1 = json.dumps(100.23)
        print(result1, type(result1))
        result2 = json.dumps('adc')
        print(result2, type(result2))           # 单引号会转换成双引号
    
        # 将 json 中 的数据转换成 python 数据
        content1 = json.loads('"adc"', encoding='utf-8')
        print(content1, type(content1))           # 结果为:adc <class 'str'.
        content2 = json.loads('{"name": "张三", "sex": "男", "age": 21}', encoding='utf-8')
        print(content2, type(content2))
    
        # 将 json 中 的数据转换成 python 数据
        # with open('./test.json', encoding='utf-8') as f:
        #     info = f.read()
        #     print(info, type(info))
        #     dict1 = json.load(info, encoding='utf-8')
        #     for i in dict1['data']:
        #         print(i['ur1'])
    
        # 读 json 文件
        with open('./test.json', encoding='utf-8') as f:
            result3 = json.load(f)
            print(type(result3), result3)
    
        # all_student = [
        #     {'name': '阿黄', 'age': 21},
        #     {'name': '小白', 'age': 45},
        #     {'name': '小黄', 'age': 12}
        # ]
        # with open('./student.json', 'w', encoding='utf-8') as f:
        #     json.dump(all_student, f)           # 相当于:f.write(json.dumps(all_student))
        # with open('./student.json', encoding='utf-8') as f:
        #     result4 = json.load(f)
        #     print(type(result3), result4)
        with open('./student.json', 'r', encoding='utf-8') as f:
            all_student = json.load(f)
        add_student(all_student)
        add_student(all_student)
        with open('./student.json', 'w', encoding='utf-8') as f:
            json.dump(all_student, f)
    
    
    def add_student(list1: list):
        name = input('name:')
        age = int(input('age:'))
        score = float(input('score:'))
        list1.append({'name': name, 'age': age, 'score': score})
    
    
    if __name__ == '__main__':
        main()
    
    

    运行结果:

    100.23 <class 'str'>
    "adc" <class 'str'>
    adc <class 'str'>
    {'name': '张三', 'sex': '男', 'age': 21} <class 'dict'>
    <class 'dict'> {'code': 200, 'msg': '成功!', 'data': [{'createdAt': '2017-11-23T08:32:29.546Z', 'publishedAt': '2017-11-24T11:08:03.624Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171123083218_5mhRLg_sakura.gun_23_11_2017_8_32_9_312.jpeg'}, {'createdAt': '2017-11-20T07:49:41.797Z', 'publishedAt': '2017-11-20T12:42:06.454Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171120074925_ZXDh6l_joanne_722_20_11_2017_7_49_16_336.jpeg'}, {'createdAt': '2017-11-17T10:31:41.155Z', 'publishedAt': '2017-11-17T12:39:48.189Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/2017-11-17-22794158_128707347832045_9158114204975104000_n.jpg'}, {'createdAt': '2017-11-16T11:57:11.4Z', 'publishedAt': '2017-11-16T12:01:05.619Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171116115656_vnsrab_Screenshot.jpeg'}, {'createdAt': '2017-11-14T10:13:21.137Z', 'publishedAt': '2017-11-14T10:43:36.180Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171114101305_NIAzCK_rakukoo_14_11_2017_10_12_58_703.jpeg'}, {'createdAt': '2017-11-13T08:42:35.306Z', 'publishedAt': '2017-11-13T12:10:58.643Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171113084220_LuJgqv_sakura.gun_13_11_2017_8_42_12_311.jpeg'}, {'createdAt': '2017-11-09T09:53:06.802Z', 'publishedAt': '2017-11-10T08:10:02.838Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171109095254_dOw5qh_bluenamchu_9_11_2017_9_52_47_256.jpeg'}, {'createdAt': '2017-11-07T10:02:58.73Z', 'publishedAt': '2017-11-08T11:00:50.559Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171107100244_0fbENB_yyannwong_7_11_2017_10_2_5_982.jpeg'}, {'createdAt': '2017-11-02T09:23:05.497Z', 'publishedAt': '2017-11-06T12:40:39.976Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171102092251_AY0l4b_alrisaa_2_11_2017_9_22_44_335.jpeg'}, {'createdAt': '2017-11-01T14:18:52.937Z', 'publishedAt': '2017-11-01T14:20:59.209Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171101141835_yQYTXc_enakorin_1_11_2017_14_16_45_351.jpeg'}, {'createdAt': '2017-10-31T10:56:55.988Z', 'publishedAt': '2017-10-31T12:25:55.217Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/2017-10-31-nozomisasaki_official_31_10_2017_10_49_17_24.jpg'}, {'createdAt': '2017-10-27T11:40:43.793Z', 'publishedAt': '2017-10-27T12:02:30.376Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171027114026_v8VFwP_joanne_722_27_10_2017_11_40_17_370.jpeg'}, {'createdAt': '2017-10-25T11:30:18.697Z', 'publishedAt': '2017-10-25T11:39:10.950Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171025112955_lmesMu_katyteiko_25_10_2017_11_29_43_270.jpeg'}, {'createdAt': '2017-10-24T08:35:43.61Z', 'publishedAt': '2017-10-24T11:50:49.1Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171024083526_Hq4gO6_bluenamchu_24_10_2017_8_34_28_246.jpeg'}, {'createdAt': '2017-10-23T12:31:32.639Z', 'publishedAt': '2017-10-23T12:44:23.660Z', 'type': '美图', 'url': 'https://img.gank.io/anri.kumaki_23_10_2017_12_27_30_151.jpg'}, {'createdAt': '2017-10-18T09:14:07.966Z', 'publishedAt': '2017-10-20T10:26:24.673Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171018091347_Z81Beh_nini.nicky_18_10_2017_9_13_35_727.jpeg'}, {'createdAt': '2017-10-12T07:32:28.644Z', 'publishedAt': '2017-10-17T13:10:43.731Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171012073213_p4H630_joycechu_syc_12_10_2017_7_32_7_433.jpeg'}, {'createdAt': '2017-10-12T07:31:27.363Z', 'publishedAt': '2017-10-16T12:19:20.311Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171012073108_0y12KR_anri.kumaki_12_10_2017_7_30_58_141.jpeg'}, {'createdAt': '2017-10-11T08:49:21.485Z', 'publishedAt': '2017-10-11T12:40:42.545Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171011084856_0YQ0jN_joanne_722_11_10_2017_8_39_5_505.jpeg'}, {'createdAt': '2017-10-10T12:38:25.180Z', 'publishedAt': '2017-10-10T12:41:34.882Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/2017-10-10-sakura.gun_10_10_2017_12_33_34_751.jpg'}]}
    name:asd
    age:12
    score:78
    name:阿萨德
    age:23
    score:89
    
    # student.json 文件里面的内容为:
    [{"name": "a", "age": 2, "score": 2.0}, {"name": "s", "age": 3, "score": 3.0}, {"name": "asd", "age": 12, "score": 78.0}, {"name": "\u963f\u8428\u5fb7", "age": 23, "score": 89.0}]
    

    三、网络请求

    python 中的数据请求(HTTP请求),是第三方库 requests 来提供的。

    1.requests 第三方库的使用

    get/post 都是发送请求,获取接口提供的数据
    .get(url, params=None)
    url -----需要获取的参数地址
    params -----传字典,参数列表(给服务器发送请求的时候需要传给服务器的数据)
    完整的接口:协议名://主机地址/路径?参数名=值1&参数名=值2

    .post(url, params=None, json=None)
    例如:

    import requests
    
    
    def main():
        # 1.发送一个请求,并且获取返回的数据
        # 服务器返回的数据较响应
        response = requests.get('https//www.apiopen.top/meituApi?page=1')
        print(response)
    
        # 2.从响应中获取数据
        # a.获取 json 数据
        content_json = response.json()          # 会自动将 json 数据转换成 python 对应的数据
        print(type(content_json))
    
        # b.获取字符串数据
        content_json = response.text
        print(type(content_json))
        print(content_json)
    
        # c.获取二进制数据(元素数据)
        content_json = response.content
    
    
    if __name__ == '__main__':
        main()
    
    

    运行结果:

    
    

    四、异常

    1.异常捕获:让本该报错的地方,不报错。

    当知道某段代码会出现异常,而且没有办法避免同时又希望出现异常时程序不崩溃,
    就可以通过异常捕获来让程序不崩溃,并且自行处理异常。

    2.异常捕获的语法:

    a.try——except -----可以捕获所有类型的异常

    tey:
    代码段1(可能会出现异常的代码段)
    except:
    代码段2(出现异常后处理异常的代码段)

    执行过程:执行代码段1,如果代码段1中出现异常,程序不崩溃,直接执行代码段2。
    如果代码段1中没有出现异常,那就不执行代码段2,而是执行后面的其它语句。

    b.try - except 错误类型(捕获指定类型的异常)
        只有代码段1出现了指定类型的异常才捕获。
    

    try:
    代码段1(可能会出现的代码段)
    except 错误类型:
    代码段2(出现异常后处理异常的代码段)

    c.try - except(错误类型1, 错误类型2···)
        同时捕获多种指定的异常,对不同的异常做相同处理。
    

    try:
    代码段1(可能会出现的代码段)
    except (错误类型1, 错误类型2···):
    代码段2(出现异常后处理异常的代码段)

    d.try - except 错误类型1 - except 错误类型2···

    可以对不同的异常做不同处理。
    try:
    代码段1(可能会出现的代码段)
    except 错误类型1:
    代码段2(出现异常后处理异常的代码段)
    错误类型2···:
    except 错误类型2:
    代码段3(出现异常后处理异常的代码段)
    ······

    3.抛出异常: -----主动让程序崩溃

    raise 错误类型 -----程序执行到这句代码,就报错,抛出指定错误类型。

    说明:错误类型:可以是系统提供的错误类型,也可以是自定义错误类型(要求这个 值必须是一个 Exception 的子类)
    例如:

    def get_num():
        while True:
            try:
                num1 = int(input('请输入一个数字'))
                print(num1)
                break
            except:
                print('输入有误,请重新输入!')
        return num1
    
    
    def main():
        get_num()
    
    
    if __name__ == '__main__':
        main()
    
    
    

    运行结果:

    请输入一个数字123k
    输入有误,请重新输入!
    请输入一个数字123
    123
    
    

    相关文章

      网友评论

          本文标题:day13、json数据、网络请求、异常 2019-01-09

          本文链接:https://www.haomeiwen.com/subject/dsigrqtx.html