文件操作, 使用代碼 來讀寫文件
1, Game 案例,最高分不能保存的, 可以將最高分保存到文件中,
2, 自動化, 測試數據在文件中保存的, 從文件中讀取測試數據,進行自動化代碼的執行
文件: 可以存儲在長期存儲設備(硬盤, U盤)上的一段數據即為文件
1, 計算機只認識 二進制數據(0 和 1)
2, 所有的文件在計算機中存儲的形式都是 二進制即 0 和 1 ,打開文件看到的是文字不是 0 和 1 ,原因是打開文件的
軟件會自動的將二進制轉換為 文字
文件的分類(根據能否使用文本軟件(記事本)打開文件):
- 文本文件
- 二進制文件
txt, py, md, jsonmp3mp4 ....png, jpg, gif, exe1. 打開文件
2. 讀、寫文件
l, 讀 將文件內容讀入內存
2, 寫 將內存內容寫入文件
3. 關閉文件
open()open(file, mode='r', encoding=None) # 將硬盤中的文件 加載到內存中
- file: 表示要操作的文件的名字,可以使用相對路徑 和絕對路徑
- 絕對路徑, 從根目錄開始書寫的路徑 C:/ D:/
- 相對路徑, 從當前目錄開始書寫的路徑 ./ ../
- mode: 打開文件的方式
- r , 只讀打開 read, 如果文件不存在,會報錯
- w , 只寫打開, write, 如果文件存在, 會覆蓋原文件
- a , 追加打開, append, 在文件的末尾寫入新的內容
- encoding: 編碼格式, 指 二進制數據 和 漢字 轉換的規則的
- utf-8(常用) : 將一個漢字轉換為 3 個字節的二進制
- gbk: 將一個漢字轉換為 2 個字節的二進制
返回值: 文件對象, 后續對文件的操作, 都需要這個文件對象
close()文件對象.close() # 關閉文件, 如果是 寫文件, 會自動保存, 即將內存中的數據同步到硬盤中
read()變量 = 文件對象.read()
返回值: 返回讀取到文件內容, 類型是字符串
# f=open("a.txt",encoding="utf-8") #不寫mode,默認’r'
# buf=f.read()
# print(buf)
with open('a.txt','r',encoding='utf-8') as f:
buf=f.read()
print(buf)
write()文件對象.write()
# 參數: 寫入文件的內容, 類型 字符串
# 返回值: 寫入文件中的字符數, 字符串的長度, 一般不關注
# 打開文件
f = open('a.txt', 'w', encoding='utf-8')
# 寫文件
# f.write("好好學習 \n天天向上")
f.write("第二次寫入,覆蓋第一次內容")
# 關閉文件
f.close()
with open(file, mode, encoding) as 變量: # 變量 就是文件對象
pass
# 使用這種寫法打開文件, 會自動進行關閉,不用手動書寫關閉的代碼
# 出了 with 的縮進之后, 文件就會自動關閉
with open('a.txt', 'a', encoding='utf-8') as f: #a:從a.txt的末尾 追加 內容
f.write('good good study\n')
readline()?件對象.readline() # ?次讀取??的內容, 返回讀取到的內容
read() 和 readline() 如果讀到?件末尾, 返回的都是 空字符串
with open('a.txt', encoding='utf-8') as f:
buf = f.readline()
print(buf) # aaaaaa
buf1 = f.readline()
print(buf1) # bbbbbb
讀取??件
# with open('a.txt', encoding='utf-8') as f:
# while True:
# buf = f.readline() # ?件讀完了,返回 空字符串
# if buf == "":
# break
# else:
# print(buf, end='')
with open('a.txt', encoding='utf-8') as f:
while True:
buf = f.readline() # ?件讀完了,返回 空字符串
if buf: # 空字符串 是 False, ?空字符串 是True
print(buf, end='')
else:
break
r w a 稱為是?本?式打開, 適?于 ?本?件, 會對?進制進?編碼轉換
rb wb ab 稱為是?進制?式打開, 可以打開?本?件和?進制?件, 但是 ?進制?件只能使? ?進制?式打開,
同時,不能傳遞 encoding 參數
json ?件1, json ?件的本質也是?本?件, 就可以直接使? read 和
write 去進?操作
2, json ?件?較特殊, ?較像 Python 中的字典和列表
3, json ?件使??較頻繁,按照 read 和 write 的操作,?較麻煩,
專?的?法來操作 json ?件, 可以直接得到 Python 中的列表和字典
介紹:
1, json ?件, 是?種基于?本,獨?于語?的輕量級數據交換格式。
- 基于?本, ?本?件,不包含 圖?,視頻等
- 獨?于語?, 不是某?種語?特有的, Python,Java, C++,
....
- 輕量級, 相同的數據量,json ?件的占?的?件??相對較?
- 數據交換格式, 后端服務器 和前端?? 交換數據使?的格式
2, 在?動化測試中經常?來存放測試數據,?件后綴名為:.json
json 操作json ?件的定義我叫?明,我今年 18 歲,性別男, 學校 空, 愛好 聽歌,吃飯,打??, 我的居住地址為 國家 中國, 城市 ?州.
{
"name":"小明",
"age": 18,
"isMan": true,
"school": null,
"like":["聽歌","吃飯","打豆豆"],
"address": {
"country": "China",
"city": "廣州"
}
}
json ?件1, 可以直接使? read 去讀, 但是 想要取到數據很麻煩
2, 使? 專?的?法去讀
- 1. 導包 import json
- 2. json.load(?件對象) ---> 得到的是 列表 或者字典
import json
with open("info", encoding="utf-8") as f:
buf = json.load(f)
print(buf) # {'name': '小明', 'age': 18, 'isMan': True, 'school': None, 'like': ['聽歌', '吃飯', '打豆豆'], 'address': {'country': 'China', 'city': '廣州'}}
print(buf.get('name')) # 小明
print(buf.get('like')) # ['聽歌', '吃飯', '打豆豆']
print(buf.get('address').get("city")) # 廣州
print(buf.get('like')[2]) # 打豆豆
練習
我叫?明,我今年 18 歲,性別男, 愛好 聽歌, 吃飯,打??,
我的居住地址為 國家中國, 城市?州. ---> 對象
我叫?紅,我今年 17 歲,性別?, 愛好 聽歌, 學習,購物
我的居住地址為 國家 中國, 城市北京. ---> 對象
-----
獲取 每個?的姓名, 年齡 性別, 城市
json文件:
[
{
"name": "小明",
"age": 18,
"isMan": true,
"like": [
"聽歌",
"吃飯",
"打豆豆"
],
"address": {
"country": "China",
"city": "廣州"
}
},
{
"name": "小紅",
"age": 17,
"isMan": false,
"like": [
"聽歌",
"學習",
"購物"
],
"address": {
"country": "China",
"city": "北京"
}
}
]
import json
with open("info2.json", encoding="utf-8") as f:
buf = json.load(f) # 列表
for i in buf:
if i.get("isMan"):
sex="男"
else:
sex="女"
print(f"name:{i.get('name')},age:{i.get('age')},sex:{sex},city:{i.get('address').get('city')}")
將 Python 中列表或者字典 轉換為 json ?件
導包 import json
使? json.dump(Python中數據, ?件對象)
import json
info = {'name': '?明', 'age': 18}
with open('info3.json', 'w', encoding='utf-8') as f:
# json.dump(info, f)
# json.dump(info, f, ensure_ascii=False) # 直接顯示中?
json.dump(info, f, ensure_ascii=False, indent=2) # 直接顯示中?,并且縮進

dump參數:
ensure_ascii參數用于控制非ASCII字符的處理方式;<1>indent參數用于定義生成的JSON字符串或文件的縮進級別,使得輸出更易于閱讀;<2>separators參數允許指定分隔符;sort_keys參數可以指定是否對字典的鍵進行排序;default和cls參數提供了自定義序列化的方式
1, 程序在運?時, 如果Python解釋器遇到到?個錯誤, 則會停?程序的執?, 并且提示?些錯誤信息, 這就是異常.
2, 程序停?執?并且提示錯誤信息這個動作, 通常稱之為: 拋出(raise) 異常
異常類型: 錯誤描述信息
FileNotFoundError: [Errno 2] No such file ordirectory: 'aaaa.txt'
ZeroDivisionError: division by zero
ValueError: invalid literal for int() with base 10:'78.1'
1, 程序代碼在執?的時候, 如果遇到異常, 程序就會終?,不會繼續執?
2, 需求: 程序遇到異常之后, 不會結束,可以繼續執?,
3, 實現需求: 就需要使? 異常捕獲
try:
可能發?異常的代碼
except: # 可以捕獲任意類型的異常
發?了異常執?的代碼
# 1. 獲取?戶從鍵盤輸?的數據
num = input('請輸?數字:')
try:
# 2. 轉換數據類型為整數
num = int(num)
# 3. 數據轉換類型正確時, 輸出數據內容
print(num)
except:
# 4. 數據轉換類型錯誤時, 提示輸?正確數據
print('請輸?正確的數字')
發?的異??赡艽嬖诙喾N, 針對不同類型的異常, 解決處理的?案不?樣
try:
可能發?異常的代碼
except 異常類型1:
發了異常類型1,執?的代碼
except 異常類型2:
發了異常類型2,執?的代碼
except .....:
pass
try:
num = int(input('請輸??個整數數字:'))
num1 = 8 / num
print(num1)
except ValueError: #
print('輸?的內容?數字,請重新輸?')
except ZeroDivisionError:
print('不能輸出數字 0, 請重新輸?')
try:
可能發?異常的代碼
except Exception as 變量: # Exception 常?異常類的?類, 變量 異常對象,print()可以打印異常信息
發?異常執?的代碼
try:
num = int(input('請輸??個整數數字:'))
num1 = 8 / num
print(num1)
except Exception as e:
print(f'發?了異常, {e}')
try:
可能發?異常的代碼
except 異常類型:
發?了指定類型的異常執?的代碼
except Exception as e:
發?了其他類型的異常執?的代碼
else:
沒有發?異常, 會執?的代碼
finally:
不管有沒有發?異常, 都會執?的代碼
案例
需求:
1. 獲取用戶輸入的數字
2. 判斷獲取的數字是否整數
3. 如果不是整數, 提示輸入錯誤
4. 如果是整數, 則進一步判斷是奇數還是偶數
5. 最終提示: 程序運行結束
# ?案?
使?異常捕獲
# ?案?
if 判斷
字符串.isdigit() 判斷數字是否是純數字,是 純數字,返回
True,不是返回 False
# 1. 獲取?戶輸?的數字
num = input('請輸?數字:')
try:
# 2. 判斷獲取的數字是否整數
num = int(num) # 沒有發?異常, 說明是整數,如果發?異常,說明不是整數
except Exception as e:
# 3. 如果不是整數, 提示輸?錯誤
print("輸?錯誤", e)
else:
# 4. 如果是整數, 則進?步判斷是奇數還是偶數
if num % 2 == 0:
print('偶數')
else:
print('奇數')
# 5. 最終提示: 程序運?結束
finally:
print('程序運?結束')
# 1. 獲取?戶輸?的數字
num = input('請輸?數字:')
# 2. 判斷獲取的數字是否整數
if num.isdigit():
# 如果是 True, 表示是整數
# 類型轉換
num = int(num)
# 4. 如果是整數, 則進?步判斷是奇數還是偶數
if num % 2 == 0:
print('偶數')
else:
print('奇數')
# 3. 如果不是整數, 提示輸?錯誤
else:
print('輸?錯誤')
# 5. 最終提示: 程序運?結束
print('程序運?結束')
.isdigit():判斷數字是否是純數字,是 純數字,返回
"10".isdigit()
-True
"11.5".isdigit()
-False
"aaa".isdigit()
-False
1, 異常傳遞 是 Python 中已經實現好的功能, 不需要我們寫代碼實現
2, 異常傳遞是指, 在函數的嵌套調?過程中,如果發?了異常,沒有進?捕獲,會將這個異常傳遞到函數調?的地?, 直到被捕獲為?, 如果?直沒有捕獲,才會報錯,終?執?
1, 在執?代碼的過程中,之所以會發?異常,終?代碼執?,是因為 代碼執? 遇到了 raise 關鍵字
2, raise 關鍵字的作?, 就是來拋出異常,讓代碼終?執?
3, 應?場景: ??書寫代碼模塊,讓別?使?,為了讓別?按照你的規定使?你的代碼,你就可以在他不滿?你條件的情況下,使?raise 拋出異常