day13-日常(json和異常)

json

1.什么是json數(shù)據(jù)

json是一種具有特定語法的數(shù)據(jù)格式

2.json數(shù)據(jù)的語法

一個json數(shù)據(jù)有且只有一個數(shù)據(jù), 這個數(shù)據(jù)的數(shù)據(jù)類型必須是json支持的數(shù)據(jù)類型

3.json支持的數(shù)據(jù)類型

  • a.數(shù)字類型: 包含所有的數(shù)字,包括整數(shù)、小數(shù);例如: 100, 12.5, -3.14

    注意:

    • 1)整數(shù)前面不能加'+'
    • 2)支持科學(xué)計數(shù)法: 3e2
  • b.字符串: 使用雙引號括起來的數(shù)據(jù); 例如:"abc", "abc123,!"

  • c.布爾: 只有true和false兩個值

  • d.數(shù)組: 相當于python的列表,用[]括起來,多個元素用逗號隔開;例如: [100, "abc", [1, 2]]

  • e.字典: 相當于python的字典, 用{}括起來,多個鍵值對用逗號隔開, 例如:{"a": 10, "b": 20, "c": [1, 3]}

  • f.空值: null,相當于python中的None

4.python處理json數(shù)據(jù)

python中提供了json模塊,專門用來處理json數(shù)據(jù)

1) 將json數(shù)據(jù)轉(zhuǎn)換成python數(shù)據(jù)(通過爬蟲獲取到別人提供的json數(shù)據(jù),在python中處理)

  • a.轉(zhuǎn)換方式
json python
數(shù)字 int/float
字符串 str, 可能雙引號會變成單引號
布爾 bool, 會將json中的true/false轉(zhuǎn)換成True/False
數(shù)組 list
字典 dict
空值(null) None
  • b.loads方法

    loads(字符串, encoding='utf-8') - 將字符串中的json數(shù)據(jù)轉(zhuǎn)換成對應(yīng)的python數(shù)據(jù)

    注意: 這兒的字符串中內(nèi)容必須json數(shù)據(jù)

2)將python數(shù)據(jù)轉(zhuǎn)換成json數(shù)據(jù)(python寫后臺接口將數(shù)據(jù)提供給客戶端)

  • a.轉(zhuǎn)換方式

    python json
    int/float 數(shù)字
    str 字符串, 單引號會變成雙引號
    bool True->true; False->false
    list/tuple 數(shù)組
    dict 字典
    None null
  • b.dumps(對象) - 將指定的對象轉(zhuǎn)換成json數(shù)據(jù), 以字符串的形式返回(這兒的對象指的就是python數(shù)據(jù))

    注意: 返回值是字符串,并且字符串的!!!!內(nèi)容!!!!是json數(shù)據(jù)

5.json文件處理

嚴格來說,json文件是文件內(nèi)容是json數(shù)據(jù)的文件

  • 1.load(文件對象) - 將指定文件中的內(nèi)容讀出來,并且轉(zhuǎn)換成python對應(yīng)的數(shù)據(jù)。

    注意: 這兒的文件對象對應(yīng)的文件必須是json文件

  • 2.dump(對象, 文件對象) - 將指定對象轉(zhuǎn)換成內(nèi)容是json格式的字符串,然后寫入指定的文件中
    注意: 這兒的對象對應(yīng)的類型必須是能夠轉(zhuǎn)換成json的數(shù)據(jù)類型

示例:

import json


def main():
    print('================3.讀json文件=================')

    with open('data.json', encoding='utf-8') as f:
        result = json.load(f)   # 相當于 result = json.loads(f.read())
        print(type(result), result['msg'])

    all_student = [
        {'name': '小明', 'age': 12, 'tel': '1237736'},
        {'name': 'yuting', 'age': 18, 'tel': '23333'},
        {'name': 'Luffy', 'age': 20, 'tel': None},
        {'name': 'zuoLuo', 'age': 30, 'tel': '923736'},
    ]
    with open('student.json', 'w', encoding='utf-8') as f:
        json.dump(all_student, f)  # 相當于 f.write(json.dumps(all_student))

    print(' ===============2.python轉(zhuǎn)json===============')
    result = json.dumps(100.23)
    print(type(result), result)    # '100.23'

    result = json.dumps('abc')
    print(type(result), result)  # '"abc"'

    result = json.dumps(True)
    print(type(result), result)  # 'true'

    result = json.dumps([10, 'abc', True, None])
    print(type(result), result)  # '[10, "abc", true, null]'

    result = json.dumps((10, 'abc', True, None))
    print(type(result), result)  # '[10, "abc", true, null]'

    result = json.dumps({'a': 10, 'b': 'abc', 'c': True, 'd': None})
    print(type(result), result)  # '{"a": 10, "b": "abc", "c": true, "d": null}'

    # 集合不能轉(zhuǎn)換成json數(shù)據(jù)
    # result = json.dumps({10, 'abc', True, None})
    # print(type(result), result)  # '[10, "abc", true, null]'


    # ===============1.json轉(zhuǎn)python===============
    print('===========================')
    # 將json中的字符串轉(zhuǎn)換成python數(shù)據(jù)
    content = json.loads('"abc"', encoding='utf-8')
    print(content, type(content))   # abc <class 'str'>

    # 將json中的數(shù)字轉(zhuǎn)換成python數(shù)據(jù)
    content = json.loads('100', encoding='utf-8')
    print(content, type(content))

    # 將json中的字典轉(zhuǎn)換成python數(shù)據(jù)
    message = '{"name": "張三", "age": 18, "sex": null, "marry": true}'
    content = json.loads(message, encoding='utf-8')
    print(content, type(content))
    print(content['name'])

異常

1.異常捕獲 - 讓本該報錯的代碼不報錯

你知道某段代碼會出現(xiàn)異常,而且沒有辦法避免,同時又希望出現(xiàn)異常的時候程序不奔潰;

這個時候就可以通過異常捕獲,來讓程序不奔潰并且自行處理異常

2.異常捕獲語法

  • a. try-except (可以捕獲所有類型的異常 - 只要代碼段1中出現(xiàn)了異常就捕獲)
try:
    代碼段1(可能會出現(xiàn)異常的代碼段)
except:
    代碼段2(出現(xiàn)異常后處理異常的代碼段)

其他語句

執(zhí)行過程: 執(zhí)行代碼段1,如果代碼段1中出現(xiàn)異常,程序不奔潰,直接執(zhí)行代碼段2。如果代碼段1中沒有出現(xiàn)異常,不執(zhí)行代碼段2而是直接執(zhí)行后面的其他語句

  • b. try - except 錯誤類型 (捕獲指定類型的異常 - 只有代碼段1中出現(xiàn)了指定類型的異常才捕獲)
try:
    代碼段1(可能會出現(xiàn)異常的代碼段)
except 錯誤類型:
    代碼段2(出現(xiàn)異常后處理異常的代碼段)
  • c.try - except (錯誤類型1,錯誤類型2...) (同時捕獲多種指定異常)
try:
    代碼段1(可能會出現(xiàn)異常的代碼段)
except (錯誤類型1,錯誤類型2...):
    代碼段2(出現(xiàn)異常后處理異常的代碼段)
  • d.try-except 錯誤類型1 - except 錯誤類型2... (同時捕獲多種異常,可以對不同的異常做不同的處理)
try:
    代碼段1(可能會出現(xiàn)異常的代碼段)
except 錯誤類型1:
    代碼段2
except 錯誤類型2:
    代碼段3
...

3.拋出異常 - 主動讓程序奔潰

raise 錯誤類型 - 程序執(zhí)行到這句代碼就出現(xiàn)指定類型的異常!

說明:錯誤類型 - 可以是系統(tǒng)提供的錯誤類型, 也可以是自定義錯誤類型(要求這個值必須是一個類,而且是Exception的子類)

自定義錯誤類型

class MyValueError(Exception):
    def __str__(self):
        return '給的值不滿足要求!'


def my_function(age: int):
    """
    age必須小于18!!!
    """
    if age > 18:
        raise YTValueError
    print(age)


my_function(20)


def method3():
    print('==============2.try-except 錯誤類型1-except 錯誤類型2...===========')
    try:
        with open('abc.txt', 'r') as f:
            print(f.read())
        print({'a': 100}['b'])  # KeyError
    except KeyError:
        print('key不存在')
    except FileNotFoundError:
        print('文件不存在!')

    print('~~~~~~~~~')


def method2():
    print('==============2.try-except 錯誤類型===========')
    try:
        print({'a': 100}['b'])  # KeyError
        print(a)
        print([1, 2, 3][4])  # IndexError
    except (KeyError, IndexError):
        print('出現(xiàn)異常')


def method1():
    print('==============1.try-except===========')
    # try:
    #     number = int(input('請輸入一個數(shù)字:'))
    #     print(number)
    # except:
    #     print('出現(xiàn)異常,輸入有誤!')

    try:
        print('abc'[4])   # IndexError
        print('=======')
        print({'a': 10}['b'])  # KeyError
    except:
        print('出現(xiàn)異常!')

練習(xí): 輸入數(shù)字,保存成int類型,如果輸入有誤就繼續(xù)輸入,直到輸入正確為止! 輸入數(shù)字: 12a 輸入有誤,繼續(xù)輸入! 輸入數(shù)字:a12 輸入有誤,繼續(xù)輸入! ... 輸入數(shù)字: 23

def method11():
    print('==============1.try-except===========')
    while True:
        try:
            number = int(input('輸入數(shù)字:'))
            print('輸入正確:', number)
            break
        except:
            print('輸入有誤,繼續(xù)輸入!')


def main():
    # method1()
    # method11()
    method3()


if __name__ == '__main__':
    main()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 書籍作者:劉順仁 【01】楔子 這本書的寫作方式有一點獨特,有兩個主角,一個是經(jīng)理人,一個是投資人,每一個獨立的事...
    Altlantice閱讀 1,304評論 1 4
  • 日落秋霞晚,危峰月影殘。銀星數(shù)點照云端,夜色漸闌珊。 杳杳鐘聲婉,悠悠笛曲憐。萬家燈火也斑斕,唯我甚孤單。 【詞林...
    Odette伊菲閱讀 430評論 9 10
  • 昨天晚上接到呱媽打來電話 說二舅爺去世了 我就在想 這人好好的 怎么說沒有就沒有了呢 突然就想起了小時候 那時候還...
    小兔子書書閱讀 221評論 0 0
  • 【概述:專門研究甘寧早年的事跡】 甘寧,字興霸,本籍為荊州南陽,后來客居巴郡臨江。 錦帆游俠,負毦帶鈴 甘寧再...
    做筆記的喵Cc閱讀 973評論 0 3
  • 寒露匆匆秋將盡,冬至姍姍欲登臨。 北風(fēng)陣陣錐衰骨,暖足徐徐冷意侵。
    藍手印zzy閱讀 265評論 2 15

友情鏈接更多精彩內(nèi)容