一图甜、json
1.什么是json數據
json是一種具有特定語法的數據格式
2.json數據的語法
一個json數據有且只有一個數據, 這個數據的數據類型必須是json支持的數據類型
3.json支持的數據類型
a.數字類型: 包含所有的數字,包括整數法褥、小數;例如: 100, 12.5, -3.14
注意:1)整數前面不能加'+'
2)支持科學計數法: 3e2
b.字符串: 使用雙引號括起來的數據; 例如:"abc", "abc123,!"
c.布爾: 只有true和false兩個值
d.數組: 相當于python的列表检吆,用[]括起來,多個元素用逗號隔開;例如: [100, "abc", [1, 2]]
e.字典: 相當于python的字典, 用{}括起來,多個鍵值對用逗號隔開, 例如:{"a": 10, "b": 20, "c": [1, 3]}
f.空值: null,相當于python中的None
4.python處理json數據
python中提供了json模塊尔当,專門用來處理json數據
- 將json數據轉換成python數據(通過爬蟲獲取到別人提供的json數據,在python中處理)
a.轉換方式
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 True->true; False->false
list/tuple 數組
dict 字典
None null
b.dumps(對象) - 將指定的對象轉換成json數據, 以字符串的形式返回
這兒的對象指的就是python數據
注意: 返回值是字符串,并且字符串的!!!!內容!!!!是json數據
5.json文件處理
嚴格來說,json文件是文件內容是json數據的文件
load(文件對象) - 將指定文件中的內容讀出來蹂安,并且轉換成python對應的數據椭迎。
注意:這兒的文件對象對應的文件必須是json文件
dump(對象, 文件對象) - 將指定對象轉換成內容是json格式的字符串,然后寫入指定的文件中
注意:這兒的對象對應的類型必須是能夠轉換成json的數據類型
讀json文件
import 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))
python轉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}'
# 集合不能轉換成json數據
# result = json.dumps({10, 'abc', True, None})
# print(type(result), result) # '[10, "abc", true, null]'
json轉python
# 將json中的字符串轉換成python數據
content = json.loads('"abc"', encoding='utf-8')
print(content, type(content)) # abc <class 'str'>
# 將json中的數字轉換成python數據
content = json.loads('100', encoding='utf-8')
print(content, type(content))
# 將json中的字典轉換成python數據
message = '{"name": "張三", "age": 18, "sex": null, "marry": true}'
content = json.loads(message, encoding='utf-8')
print(content, type(content))
print(content['name'])
練習1
with open('data.json', encoding='utf-8') as f:
info = f.read()
# print(type(info), info)
dict1 = json.loads(info, encoding='utf-8')
for item in dict1['data']:
print(item['url'])
二田盈、json flie
用一個列表保存多個學生的信息.寫函數向這個列表中添加學生(姓名畜号、年齡、成績)允瞧。
要求之前添加過的學生简软,下次運行程序的時候還在
all_student = 空
add_student()
import json
def add_student(list1: list):
name = input('姓名:')
age = int(input('年齡:'))
score = float(input('成績:'))
list1.append({'name': name, 'age': age, 'score': score})
def main():
# 獲取數據
# all_student = []
with open('allStudent.json', encoding='utf-8') as f:
all_student = json.load(f)
# all_student = [{}, {}]
add_student(all_student)
add_student(all_student)
# all_student = [{}, {}, {}, {}]
# 更新數據
with open('allStudent.json', 'w', encoding='utf-8') as f:
json.dump(all_student, f)
print(all_student)
三、requests
python中的數據請求(http請求),是第三方庫requests來提供的
1.requests第三方庫的使用
get/post方法都是發(fā)送請求獲取接口提供的數據
a.
get(url, params=None)
url - 字符串,需要獲取的數據的接口地址
params - 字典,參數列表(給服務器發(fā)送請求的時候需要傳給服務器的數據)
https://www.apiopen.top/meituApi?page=1
完整的接口: 協(xié)議://主機地址/路徑?參數名1=值1&參數名2=值2
b.post(url, params=None, json=None)(暫時不管!)
response = requests.get('http://rap2api.taobao.org/app/mock/121184/studentsInfo')
print(response.json())
# 1.發(fā)送請求述暂,并且獲取返回的數據
# 服務返回的數據叫響應
import requests
response = requests.get('https://www.apiopen.top/meituApi?page=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))
print(content_json)
# b.獲取字符串數據
content_text = response.text
print(type(content_text))
print(content_text)
# c.獲取二進制數據(原始數據)
content_bytes = response.content
print(content_bytes)
# 下載圖片
response2 = requests.get('http://tx.haiqq.com/uploads/allimg/170506/0H92Q915-1.jpg')
with open('luffy.jpg', 'wb') as f:
f.write(response2.content)
三痹升、exception
1.異常捕獲 - 讓本該報錯的代碼不報錯
你知道某段代碼會出現異常,而且沒有辦法避免畦韭,同時又希望出現異常的時候程序不奔潰疼蛾;
這個時候就可以通過異常捕獲,來讓程序不奔潰并且自行處理異常
2.異常捕獲語法
- a. try-except (可以捕獲所有類型的異常 - 只要代碼段1中出現了異常就捕獲)
try:
代碼段1(可能會出現異常的代碼段)
except:
代碼段2(出現異常后處理異常的代碼段)
其他語句
執(zhí)行過程: 執(zhí)行代碼段1廊驼,如果代碼段1中出現異常据过,程序不奔潰惋砂,直接執(zhí)行代碼段2。
如果代碼段1中沒有出現異常绳锅,不執(zhí)行代碼段2而是直接執(zhí)行后面的其他語句
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
except 錯誤類型2:
代碼段3
...
3.拋出異常 - 主動讓程序奔潰
raise 錯誤類型 - 程序執(zhí)行到這句代碼就出現指定類型的異常!
說明:錯誤類型 - 可以是系統(tǒng)提供的錯誤類型, 也可以是自定義錯誤類型(要求這個值必須是一個類,而且是Exception的子類)
"""
# 自定義錯誤類型
class YTValueError(Exception):
def __str__(self):
return '給的值不滿足要求!'
def yt_function(age: int):
"""
age必須小于18!!!
"""
if age > 18:
raise YTValueError
print(age)
yt_function(20)
.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('~~~~~~~~~')
try-except 錯誤類型
def method2():
print('==============2.try-except 錯誤類型===========')
try:
print({'a': 100}['b']) # KeyError
print(a)
print([1, 2, 3][4]) # IndexError
except (KeyError, IndexError):
print('出現異常')
try-except
def method1():
print('==============1.try-except===========')
# try:
# number = int(input('請輸入一個數字:'))
# print(number)
# except:
# print('出現異常,輸入有誤眷柔!')
try:
print('abc'[4]) # IndexError
print('=======')
print({'a': 10}['b']) # KeyError
except:
print('出現異常!')
練習: 輸入數字,保存成int類型,如果輸入有誤就繼續(xù)輸入原朝,直到輸入正確為止!
輸入數字: 12a 輸入有誤驯嘱,繼續(xù)輸入! 輸入數字:a12 輸入有誤,繼續(xù)輸入! ... 輸入數字: 23
def method11():
print('==============1.try-except===========')
while True:
try:
number = int(input('輸入數字:'))
print('輸入正確:', number)
break
except:
print('輸入有誤喳坠,繼續(xù)輸入!')