一、上周內容復習
1. 容器類型
列表:[元素]: 可變的,有序;任意類型;增刪改查
字典:{鍵值對}:可變的,無序;key要求不可變的數據類型并且唯一,value是任意類型;增刪改查
元組:(元素,): 不可變,有序;任意類型;查
x, y = (10, 20)
tuple1 = 10, 'abc', 23
x, *numbers = 20, 78, 90, 78, 87
x = (10,)
集合:{元素}:可變的,無序;要求不可變的數據類型并且唯一;數學集合運算
迭代器:無字面量;只能用next去取值,取出后值就不存在了;iter();生成器
2. 函數
函數的聲明
不定長參數:(*args, **kwargs)
函數的調用:
a. 調用過程
b. 調用函數就是為了執行函數體,并且獲取返回值
匿名函數:lambda 參數列表: 返回值
函數作為變量:聲明函數就是在聲明一個類型是function的變量
變量的作用域:全局變量和局部變量
遞歸:自己調用自己;三步:a. 找臨界值 b.找關系(f(n) 和 f(n-1))的關系 c.用f(n-1)實現f(n)的功能
生成器:有yield關鍵字的函數;
生成式: 值1,值2 for 變量 in 序列 條件語句
3. 文件操作
打開文件 -> 操作文件 -> 關閉文件
open(文件的地址, 打開方式, encoding=編碼方式) --> 返回被打開的文件對應的文件對象
./(當前目錄), ../(當前目錄的上一級目錄), .../(上上一級目錄)
r/rb --> 讀
w/wb --> 寫
a --> 寫
utf-8 : 中文
gbk : English
二、文件操作
補充:打開文件的時候是以讀的方式打開,如果文件不存在會報:FileNotFoundError
打開文件的時候是以寫的方式打開,如果文件不存在會自動創建對應的文件
1. 打開文件和關閉文件的縮寫
with open(文件路徑, 打開方式, encoding=編碼方式) as 文件對象:
文件操作相關代碼
說明:打開文件,執行完文件操作相關的代碼后,會自動關閉被打開的這個文件
# open('./files/aaa.txt', 'r') # FileNotFoundError
# open('./files/aaa.txt', 'w')
with open('./files/aaa.txt', 'a', encoding='utf-8') as fs:
fs.write('我是文件aaa.txt')
2. 二進制文件的讀和寫
常見的二進制文件:視頻文件、音頻文件、圖片文件、壓縮包等都是屬于二進制文件
注意:二進制文件不能設置文件編碼方式(不能給encoding賦值)
with open('./files/20180514_113207.jpg', 'rb') as f2:
content = f2.read()
print(type(content), content)
# <class 'bytes'> *** b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00\xff\xe1\x14^Exif\x00\x00MM\x00*
# \x00\x00\x00\x08\x00\x0e\x01\x00\x00\x04\x00\x00\x00\x01\x00\x00\n'
with open('./files/new_photo.jpg', 'wb') as f3:
f3.write(content) # 將照片復制到了new_photo
三、json文件(特別重要)
json是一種特定格式的數據,主要用來在互聯網上做文本數據傳輸。
json數據本身是文本數據,json文件就是后綴是.json的文件,并且文件內容必須滿足json格式的要求,
如果不滿足,會報錯(寫文本時文本內有紅色波浪報錯,用json讀取時也會報錯)
1. json格式
- a. 一個json對應一條數據
- b. json中的數據必須是json對應的數據類型
數字類型(number) --> 所有的數字,包含整數和小數,例如: 100, 12.5
字符串類型(string) --> 用雙引號括起來的數據,例如:"abc"
數組(array) --> 相當于python中的列表,例如:[100, 200, 300, "abc"]
字典(dictionary) --> 相當于python中的字典,例如:{"a": 100, "b": [1, 2, 3], "c": {}, "d": true}
布爾 --> true和false
null --> 相當于None,用來表示空
2. python對json的支持
python中專門提供了一個json模塊,用來處理json數據
load(json文件路徑) --> 將json文件的內容讀出來,并且將內容轉換成python對應的數據類型
dump(內容, json文件路徑) --> 將指定的內容,以json格式寫入到指定的json文件中
loads(json格式字符串) --> 將字符串內容是json數據的字符串轉換成python對應的數據類型數據
dumps(內容) --> 將指定的內容,轉換成json格式的字符串
- loads()
loads(字符串) --> 要求字符串的內容必須滿足json格式
import json
content1 = json.loads('100')
print(content1, type(content1)) # 100 <class 'int'>
content2 = json.loads('"abc"')
print(content2, type(content2)) # abc <class 'str'>
content3 = json.loads('[12, 12.8, "name", [1, "2a"]]')
print(content3, type(content3)) # [12, 12.8, 'name', [1, '2a']] <class 'list'>
content4 = json.loads('{"a": 1, "b": true, "c": null}')
print(content4, type(content4)) # {'a': 1, 'b': True, 'c': None} <class 'dict'>
- load()
load(文件對象) --> 將文件對象中的內容轉換成python數據類型。要求文件中的內容必須是json格式的數據。
with open('./files/test.txt') as f: # 不一定要用json文件
print(json.load(f))
- dumps()
dumps(內容) ---> 內容是python數據,返回值是一個字符串,并且字符串的內容是滿足json格式的
python轉json:
python | json |
---|---|
int/float | 數字 |
str字符串 | (會將單引號變成雙引號) |
True/False | true/false |
dict | 字典 |
列表/元組 | 數組 |
None | null |
注意:集合不能轉換成json數據,除了上面列出的類型,其他類型不能直接轉換成json格式的數據
print(json.dumps({'a': 100, 'b': True, 'c': 'hello'})) # {"a": 100, "b": true, "c": "hello"}
print(json.dumps((100, 200, 'abc'))) # [100, 200, "abc"]
# print(json.dumps(range(10))) # TypeError: Object of type 'range' is not JSON serializable
- dump()
dump(內容, 文件對象) ---> 將內容以json格式寫入文件中
with open('./files/test3.json', 'w') as f3:
json.dump({'a': 100, 'b': True, 'c': 'hello'}, f3) # [100, 200, "abc"]
四、文件的使用
數據本地化的過程:使用數據的時候從本地文件中去取數據,修改完數據后要使用新的數據取更新本地文件中的內容
例: 學生管理系統
- 添加學生,要求之前添加過的學生,下次執行程序的時候還存在
- 顯示學生信息
學生管理數據類型 --> [學生1,學生2], {'學號1': 學生1, '學號2': 學生2}
{'username': 'aaa', 'all_student':[]}
import json
# 保存所有的學生
with open ('./files/students.json') as f:
all_student = json.load(f)
def add_student():
"""
添加學生
:return:
"""
while True:
name = input('請輸入學生的姓名:')
age = input('請輸入學生的年齡:')
tel = input('請輸入學生的電話:')
# 創建學生對應的字典
student = {'name': name, 'age': age, 'tel': tel}
# 將學生添加到容器中
all_student.append(student)
# 將新的數據更新到本地文件中
with open('./files/students.json', 'w') as f:
json.dump(all_student, f)
print('添加成功!')
print('1.繼續添加')
print('2.返回上一層')
input_value = input('請選擇(1-2):')
if input_value == '1':
continue
else:
break
def show_student():
for student in all_student:
print(student)
while True:
print('=================')
print('1.添加學生')
print('2.顯示學生信息')
print('3.退出')
print('=================')
input_value = input('請選擇(1-3):')
if input_value == '1':
add_student()
elif input_value == '2':
show_student()
else:
print('退出成功')
break
練習: 在程序中聲明一個變量,用來保存當前程序執行的次數
try:
with open('./files/count_num.json', 'r', encoding='utf-8') as fs:
num = json.load(fs)
except FileNotFoundError:
with open('./files/count_num.json', 'w', encoding='utf-8') as fs:
json.dump(0, fs)
num = 0
def count_num(num):
print('該程序執行了%s次!' % (num))
num += 1
with open('./files/count_num.json', 'w', encoding='utf-8') as fs:
json.dump(num, fs)
count_num(num)
五、異常捕獲
====================拋出異常==========================
raise 異常類型
異常類型要求:是Exception類的子類
value = int(input('請輸入一個偶數'))
if value & 1:
raise ValueError
else:
print('恭喜,還活著!')
# 輸入 3 ,程序直接報錯ValueError,并崩潰
====================異常捕獲==========================
1. 報錯
--> 出現異常(后面的代碼不會執行,并且程序會直接結束)
print('===========')
a = 10 + 'abc' # TypeError: unsupported operand type(s) for +: 'int' and 'str'
print('!!!!!') # 不會打印
2. 異常捕獲
出現異常,不希望程序直接崩潰,而是想要自己對這個異常進行處理,就需要捕獲異常
- 格式1 (可以捕獲代碼段1中出現的所有類型的異常):
try:
代碼段1
except:
代碼段2
finally:
代碼段3
說明:執行代碼段1,并且檢測代碼段1是否發生異常,如果發生異常程序不崩潰,而是直接執行代碼段2
try:
value = input('請輸入數字:')
int_value = float(value)
except:
print('出現了異常')
print('輸入有誤!')
# 輸入a, 打印“出現了異常”,并打印“輸入有誤!”
try:
a = [1, 2, 3][4]
print('~~~~~~~~~~')
except:
print('出現異常')
# 第一行出現異常后,直接打印“出現異常”,而不會打印波浪號
- 格式2:
try:
代碼段1
except 異常類型:
代碼段2
finally:
代碼段3
說明:捕獲代碼段1中出現的指定類型的異常。
try:
print([1, 2][3])
except IndexError:
print('下標錯誤')
- 格式3:
try:
代碼段1
except (異常類型1,異常類型2,……):
代碼段2
finally:
代碼段3
說明: 捕獲except后的括號中所有的異常
try:
print([1, 2][3])
print({'a': 'abc'}['b'])
except (IndexError, KeyError):
print('出現異常3')
- 格式4:
try:
代碼段1
except 異常類型1:
代碼段2
except 異常類型2:
代碼段3
……
finally:
代碼段4
try:
print([1, 2][3])
print({'a': 'abc'}['b'])
except IndexError:
print('下標越界')
except KeyError:
print('鍵不存在')
finally后面的代碼段一定會執行(不管try里面的代碼是否會出現異常,以及出現異常后異常是否可以被捕獲)
(寫遺書!)
try:
f = open('./files/abcabc.txt')
except FileNotFoundError:
print('文件不存在!')
finally:
print('最后會執行的代碼')
try:
f = open('./files/abcabc.txt')
except IndexError:
print('文件不存在!')
finally:
print('最后會執行的代碼')
print('=========')
# 出現了FileNotFoundError異常,但是會打印“最后會執行的代碼”