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()