====上節(jié)回顧===
1.打開文件 -> 操作文件 -> 關(guān)閉文件
??文件對象 = open(文件路徑,打開方式,encoding='utf-8')
????./
????../
????.../
??打開方式(r,w,rb,wb,a)
????r,w,a -> 打開文本
????rb,wb -> 打開二進制
??with open(文件路徑,打開方式,encoding='utf-8') as 文件對象:
????操作文件對象
2. 文件對象.read() / 文件對象.readline()
??文件對象.write()
3.數(shù)據(jù)持久化的方法
??需要使用數(shù)據(jù)的時候先從文件中讀出來
??數(shù)據(jù)修改后將最新的數(shù)據(jù)保存到文件中
===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) 支持科學計數(shù)法
??b.字符竄: 使用雙引號引起來的數(shù)據(jù)赤炒;例如: "sdsfds1234"
??c.布爾: 只有True和False兩個值
??d.數(shù)組: 相當于python的列表,用[]括起來亏较,多個元素用逗號隔開;例如: [100,"asdf", True]
??e.字典: 相當于python的字典可霎,用{}括起來,多個鍵值用逗號隔開;例如: {'a': 1, 'b': 2}
??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中處理)
????json?-->?python
????數(shù)字???int/float
????字符串??str,可能雙引號變單引號
????布爾???bool旺罢,會將json中的true/false首字母大寫
????數(shù)組???list
????字典???dict
????空值(null)?None
??b.loads方法
??loads(字符串, encoding='utf-8') - 將字符串中的json數(shù)據(jù)轉(zhuǎn)換成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????? 數(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ù)的文件
??load(文件對象) - 將指定文件中的內(nèi)容讀出來,并且轉(zhuǎn)換成python對應的數(shù)據(jù)跪解。
??注意: 這兒的文件對象對應的文件必須是json文件
??dump(對象炉旷,文件對象) - 將指定對象轉(zhuǎn)換成內(nèi)容是json格式的字符串,然后寫入指定的文件中
??注意: 這兒的對象對應的類型必須是能夠轉(zhuǎn)換成json的數(shù)據(jù)類型
===數(shù)據(jù)請求===
??python中的數(shù)據(jù)請求(http請求)叉讥,是第三方庫request來提供的
1.requests第三方庫的使用
??get/post方法都是發(fā)送請求獲取接口提供的數(shù)據(jù)
??a. get(url, params=None)
????url - 字符串窘行,需要獲取的數(shù)據(jù)的地址
????params - 字典,參數(shù)列表(發(fā)送請求的時候需要傳給服務器的數(shù)據(jù))
????params完整的接口: 協(xié)議://主機地址/路徑?參數(shù)列表(參數(shù)名1=值1&參數(shù)2=值2)
??b.post(url, data=None, json=None)(暫時不管)
# 1.發(fā)送請求图仓,并且獲取返回數(shù)據(jù)
# 服務器返回的數(shù)據(jù)叫響應
res = requests.get('https://www.apiopen.top/meituApi?page=10')
# res = requests.get('https://www.apiopen.top/meituApi',{'page': 10})
print(res, 123)
# 從響應中獲取數(shù)據(jù)
# a.獲取json數(shù)據(jù) -
content_json = res.json() # 會自動將json數(shù)據(jù)轉(zhuǎn)換成python數(shù)據(jù)
print(content_json['data'])
# b.獲取字符串數(shù)據(jù)
content_text = res.text
print(content_text)
# c.獲取二進制數(shù)據(jù)(原始數(shù)據(jù))
content_bytes = res.content
print(content_bytes)
===異常處理===
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í)行后面的其他語句
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)異常!')
??b. try - except 錯誤類型 (捕獲指定類型的異常 - 只有代碼段1中出現(xiàn)了指定類型的異常才捕獲)
??try:
????代碼段1(可能會出現(xiàn)異常的代碼段)
??except 錯誤類型:
????代碼段2(出現(xiàn)異常后處理異常的代碼段)
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)異常')
??c.try - except (錯誤類型1,錯誤類型2...) (同時捕獲多種指定異常)
??try:
????代碼段1(可能會出現(xiàn)異常的代碼段)
??except (錯誤類型1,錯誤類型2...):
????代碼段2(出現(xiàn)異常后處理異常的代碼段)
def method3():
print('==============3.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('~~~~~~~~~')
??d.try-except 錯誤類型1 - except 錯誤類型2... (同時捕獲多種異常,可以對不同的異常做不同的處理)
??try:
????代碼段1(可能會出現(xiàn)異常的代碼段)
??except 錯誤類型1:
????代碼段2
??except 錯誤類型2:
????代碼段3
????...
3.拋出異常 - 主動讓程序奔潰
??raise 錯誤類型 - 程序執(zhí)行到這句代碼就出現(xiàn)指定類型的異常!
??說明:錯誤類型 - 可以是系統(tǒng)提供的錯誤類型, 也可以是自定義錯誤類型(要求這個值必須是一個類诈泼,而且是Exception的子類)