day12-json, Abnormal capture

一、上周內容復習

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格式的字符串

    1. 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'>
    1. load()

load(文件對象) --> 將文件對象中的內容轉換成python數據類型。要求文件中的內容必須是json格式的數據。

with open('./files/test.txt') as f:  # 不一定要用json文件
    print(json.load(f))
    1. 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
    1. 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,學生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異常,但是會打印“最后會執行的代碼”
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容