文章目錄
- 1.程序異常
- 2.文件操作
- 3.json操作
1.程序異常
1.1 異常
-
異常概念: 程序在運行時, 如果Python解釋器遇到到一個錯誤, 則會停止程序的執行, 并且提示一些錯誤信息, 這就是異常
-
拋出異常: 程序停止執行并且提示錯誤信息這個動作, 通常稱之為拋出(raise) 異常
-
提示:程序開發時,很難將所有的特殊情況都處理的面面俱到 ,通過
異常捕獲
可以針對突發事件做集中的處理,從而 保證程序的穩定性和健壯性 。在自動化測試過程中, 也可以借助捕獲異常操作, 完成類 似: 用例執行報錯時截圖、打印日志信息等操作
1.2 異常捕獲
-
基本語法:
- try:嘗試,下方編寫要嘗試代碼,不確定是否能夠正常執行的代碼
- except:如果有異常捕獲,下方編寫捕獲到異常,處理失敗的代碼
try:# 嘗試執行的代碼 except:# 出現異常時執行的代碼
-
案例:
def input_num():"""定義輸入數據函數"""try:num = int(input('請輸入數字:'))print('獲取的數據為: {}'.format(num))except:print('請輸入正確數據!')if __name__ == '__main__':input_num()# 運行結果 請輸入數字:肥腸粉 # 輸入錯誤的數據 請輸入正確數據!
-
完整語法:
try:xxx代碼pass except 錯誤類型1:# 針對錯誤類型1,對應的代碼處理pass except 錯誤類型2:# 針對錯誤類型2,對應的代碼處理pass except Exception as e:# 打印錯誤信息print(e) finally:# 無論是否有異常,都會執行的代碼pass
-
案例
def input_num():"""定義輸入數據函數"""try:num = int(input('請輸入數字:'))except ValueError:print('輸入錯誤!')else:if num % 2 == 0:print('獲取的數據為: {}, 是偶數!'.format(num))else:print('獲取的數據為: {}, 是奇數!'.format(num))finally:print('程序運行結束!')if __name__ == '__main__':input_num()# 運行結果 # 輸入1的結果 請輸入數字:1 獲取的數據為: 1, 是奇數! 程序運行結束!# 輸入2的結果 請輸入數字:2 獲取的數據為: 2, 是偶數! 程序運行結束!# 輸入異常數據"test"的結果 請輸入數字:test 輸入錯誤! 程序運行結束!
1.3 特定異常
-
說明:
- 捕獲特定異常類型, 能夠實現僅在特定異常類型出現時, 代碼再做對應的處理
- 具體的異常類型可以先行從代碼執行的報錯信息中獲取, 在設置捕獲異常操作
-
語法格式
try:# 嘗試執行的代碼 except 異常類型:# 出現異常時執行的代碼
-
案例
# 需求1. 提示用戶輸入一個整數2. 使用8 除以用戶輸入的整數并且輸出\def input_num():"""定義輸入數據函數"""try:num = int(input("請輸入整數:"))result = 8 / numprint(result)except ValueError:print("請輸入正確的整數")except ZeroDivisionError:print("除 0 錯誤")if __name__ == '__main__':input_num()# 運行結果 請輸入整數:0 # 輸入數據0 除 0 錯誤
1.4 未知異常
-
說明:
- 如果希望程序無論出現任何錯誤,都不會因為Python解釋器拋出異 常而被終止,可以捕獲Exception
- except Exception as e: e表示捕獲到的異常對象,記錄異常的錯誤 信息,e為慣用變量名,可以自定義
-
語法格式
try:# 嘗試執行的代碼 except Exception as e: # 出現異常時執行的代碼print('異常信息為: {}'.format(e))
-
案例:
def input_num():"""定義輸入數據函數"""try:num = int(input("請輸入整數:"))result = 8 / numprint(result)except Exception as e:print("出錯了:{}".format(e)) # 捕獲到異常if __name__ == '__main__':input_num()# 運行結果 請輸入整數:0 出錯了:division by zero
1.5 異常的傳遞
-
概念::是指當異常在函數內部被引發但未被捕獲時,會向調用棧的上層傳遞,直到被捕獲或到達程序頂層導致程序終止
-
案例
def func1():print("func1開始")func2()print("func1結束") # 這行之前已經發生異常,所以這行不會執行def func2():print("func2開始")1 / 0 # 引發ZeroDivisionErrorprint("func2結束") # 這行之前已經發生異常,所以這行不會執行try:func1() except ZeroDivisionError as e:print(f"捕獲到異常: {e}")# 運行結果 func1開始 func2開始 捕獲到異常: division by zero
1.6 拋出異常
-
說明
- Python 中提供了一個Exception 異常類
- 在開發時,如果滿足特定業務需求時希望拋出異常,可以:
- 1)創建一個Exception類的對象
- 2)使用raise 關鍵字拋出異常對象
-
語法格式
# 創建異常對象 ex = Exception(“異常描述信息”) # 拋出異常對象 raise ex
-
案例
def outer_func():print("outer_func開始")try:inner_func()except ValueError:print("outer_func捕獲到ValueError")print("outer_func結束")def inner_func():print("inner_func開始")raise ValueError("內部函數引發的錯誤")print("inner_func結束") # 這行不會執行outer_func()# 運行結果 outer_func開始 inner_func開始 outer_func捕獲到ValueError outer_func結束
2.文件操作
2.1 文件的概念和類型
概念
:可以存儲在長期存儲設備上的一段數據即為文件類型
:- 文本文件:可以直接使用文本編輯器查看內容的文 件, 例如: Python代碼文件
- 二進制文件:不可以直接使用文本編輯器查看內容的 文件, 例如: 音頻/視頻/圖片
2.2 文件的操作
-
操作步驟
1. 打開文件 2. 讀、寫文件- 讀將文件內容讀入內存- 寫將內存內容寫入文件 3. 關閉文件
-
說明: 文件的讀取與寫入, 都推薦使用 with open() 方法, 該方法執行結束后, 會自動關閉文件
# name: 要訪問的文件路徑及名稱 # encoding: 設置字符編碼 # f: 文件對象, 慣用變量名, 可以自定義 with open(name, encoding='utf8') as f:pass
-
文件寫入/讀取常用模式
'r'
:以只讀方式打開文件。這是默認模式。如果文件不存在,拋出異常'w'
:以只寫方式打開文件。如果文件存在會被覆蓋。如果文件不存在,創建新文件'a'
:以追加方式打開文件。如果該文件已存在,在文件末尾追加內容。如果文件不存 在,創建新文件進行寫入rb
: 以二進制格式打開一個文件用于只讀wb
:以二進制格式打開一個文件只用于寫入
-
文件讀取方法
-
read()
- 讀取整個文件內容 -
readline()
- 讀取一行 -
readlines()
- 讀取所有行并返回列表 -
迭代文件對象 - 逐行讀取
# 方法1:read() with open('example.txt', 'r') as f:content = f.read()# 方法2:逐行讀取 with open('example.txt', 'r') as f:for line in f:print(line.strip())# 方法3:readlines() with open('example.txt', 'r') as f:lines = f.readlines()for line in lines:print(line.strip())
-
-
文件寫入方法
-
write()
- 寫入字符串 -
writelines()
- 寫入字符串列表 -
文件寫入實例
# 寫入單個字符串 with open('output.txt', 'w') as f:f.write('第一行\n')f.write('第二行\n')# 寫入多行 lines = ['第一行\n', '第二行\n', '第三行\n'] with open('output.txt', 'w') as f:f.writelines(lines)
-
2.3 文件與目錄管理
- 使用
os
和os.path
模塊
import os# 檢查文件/目錄是否存在
os.path.exists('example.txt')# 獲取文件大小
os.path.getsize('example.txt')# 重命名文件
os.rename('old.txt', 'new.txt')# 刪除文件
os.remove('file_to_delete.txt')# 創建目錄
os.mkdir('new_dir')# 列出目錄內容
os.listdir('.') # 當前目錄
3.json操作
3.1 json文件
-
JSON的全稱是”JavaScript Object Notation”,是JavaScript對象表示法,它是一種基于文本,獨立于語言的輕量 級數據交換格式
-
在自動化測試中經常用來存放測試數據,文件后綴名為: .json
-
提示:其他常見的數據源文件 格式: txt/excel/csv/xml
{ "name": "小明","gender": "男","age": 88}
3.2 json語法
-
json格式說明
-
{}大括號保存對象
-
[]中括號保存數組
-
對象數組可以相互嵌套
-
數據采用鍵值對表示
-
多個數據由逗號分隔
-
-
json的鍵值
鍵
:JSON鍵必須是字符串類型, 必須使用英 文雙引號值
:JSON的值可以是是以下這些- 數字(整數或浮點數)
- 字符串(使用雙引號)
- 邏輯值(true 和false)
- 數組(列表)-> []
- 對象-> {}
- 空值: null
-
json內容格式
{"name": "tom","age": 18,"isMan": true,"school": null,"address": {"country": "中國","city": "北京","street": "長安街"},"numbers": [2, 6, 8, 9],"links": [{"name": "Baidu","url": "http://www.baidu.com"},{"name": "TaoBao","url": "http://www.taobao.com"}]}
3.3 JSON 數據操作
-
讀取
# 導入依賴包 import json# 讀取JSON文件 with open('data.json', encoding='UTF-8') as f:# 返回的數據類型為字典或列表data = json.load(f)
-
寫入
# 導入依賴包 import json# 寫入JSON data = {'name': 'Alice', 'age': 25} with open('data.json', 'w') as f:json.dump(data, f)
-
案例1(基本JSON寫入和讀取)
import json# 準備數據 data = {"name": "張三","age": 30,"is_student": False,"courses": ["數學", "英語", "計算機"],"address": {"city": "北京","street": "中關村"} }# 寫入JSON文件 with open('user_info.json', 'w', encoding='utf-8') as f:json.dump(data, f, ensure_ascii=False, indent=4) # ensure_ascii=False保證中文正常顯示# 讀取JSON文件 with open('user_info.json', 'r', encoding='utf-8') as f:loaded_data = json.load(f)print("讀取到的數據:", loaded_data)
-
案例2(稍復雜的json讀入和寫出)
import json# 復雜JSON數據 company = {"company_name": "科技公司","departments": [{"name": "研發部","employees": [{"id": 101, "name": "張工程師", "position": "高級工程師"},{"id": 102, "name": "李程序員", "position": "初級工程師"}],"budget": 1500000},{"name": "市場部","employees": [{"id": 201, "name": "王經理", "position": "市場總監"}],"budget": 800000}],"founded": "2010-01-15" }# 寫入文件 with open('company_data.json', 'w', encoding='utf-8') as f:json.dump(company, f, ensure_ascii=False, indent=4)# 讀取并查詢特定信息 with open('company_data.json', 'r', encoding='utf-8') as f:data = json.load(f)print(f"公司名稱: {data['company_name']}")print("部門信息:")for dept in data['departments']:print(f"{dept['name']}: {len(dept['employees'])}名員工, 預算: {dept['budget']}元")