python学习笔记(九)——文件和异常(重点)
學(xué)文件的目的:數(shù)據(jù)不能可能一直在內(nèi)存中存儲(chǔ),持久化存儲(chǔ)到磁盤就需要用到文件了!
一、文件和上下文管理器(重點(diǎn))
1、打開文件—open() 方法
Python open() 方法用于打開一個(gè)文件,并返回文件對(duì)象,在對(duì)文件進(jìn)行處理過(guò)程都需要使用到這個(gè)函數(shù),如果該文件無(wú)法被打開,會(huì)拋出 OSError。
注意:使用 open() 方法一定要保證關(guān)閉文件對(duì)象,即調(diào)用 close() 方法。
open() 函數(shù)常用形式是接收兩個(gè)參數(shù):文件名(file)和模式(mode)。
open(file, mode='r')完整的語(yǔ)法格式為:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)參數(shù)說(shuō)明:
- file: 必需,文件路徑(相對(duì)或者絕對(duì)路徑)。
- mode: 可選,文件打開模式
- buffering: 設(shè)置緩沖
- encoding: 一般使用utf8
- errors: 報(bào)錯(cuò)級(jí)別
- newline: 區(qū)分換行符
- closefd: 傳入的file參數(shù)類型
- opener: 設(shè)置自定義開啟器,開啟器的返回值必須是一個(gè)打開的文件描述符。
常用mode 參數(shù);
| r | 以只讀方式打開,文件指針默認(rèn)放在文件開頭,文件不存在則報(bào)錯(cuò) |
| r+ | 打開一個(gè)文件用于讀寫,文件指針默認(rèn)放在文件開頭,文件不存在則報(bào)錯(cuò) |
| w | 打開一個(gè)文件只用于寫入,如果該文件已存在則將其覆蓋(你可以理解為之前寫的內(nèi)容會(huì)被覆蓋),如果不存在,創(chuàng)建新文件 |
| w+ | 打開一個(gè)文件用于讀寫,如果該文件已存在則將其覆蓋,如果不存在,創(chuàng)建新文件 |
| a | 打開一個(gè)文件 用于追加,如果文件存在,文件指針會(huì)放到文件結(jié)尾(也就是說(shuō),新的內(nèi)容將會(huì)被寫入到已有內(nèi)容之后),如果不存在,創(chuàng)建新文件進(jìn)行寫入 |
| a+ | 打開一個(gè)文件用于讀寫,如果文件存在,文件指針會(huì)放到文件結(jié)尾,如果不存在,創(chuàng)建新文件進(jìn)行寫入 |
注意:默認(rèn)為文本模式,其他模式:rb rb+ wb wb+ ab ab+ 加b的作用,以二進(jìn)制的格式打開文件,進(jìn)行上述操作如果要以二進(jìn)制模式打開,加上 b 。
2、file 對(duì)象
file 對(duì)象使用 open 函數(shù)來(lái)創(chuàng)建,下表列出了 file 對(duì)象常用的函數(shù):
| 讀取指定大小的內(nèi)容 | f.read() |
| 讀取一行的內(nèi)容 | f.readline() |
| 讀取多行內(nèi)容 | f.readlines() |
| 寫入內(nèi)容 | f.write(data) |
| 寫入多行(需要自己加換行符) | f.writelines(lines) |
| 立即刷新緩沖(相當(dāng)于文件保存) | f.flush() |
| 獲得游標(biāo)位置 | f.tell() |
| 調(diào)整游標(biāo)位置 | f.seek(position) |
Python 文件 flush() 方法是用來(lái)把文件從內(nèi)存buffer(緩沖區(qū))中強(qiáng)制刷新到硬盤中,同時(shí)清空緩沖區(qū)。
一般情況下,文件關(guān)閉后會(huì)自動(dòng)刷新到硬盤中,但有時(shí)你需要在關(guān)閉前刷新到硬盤中,這時(shí)就可以使用 flush() 方法。
實(shí)例:
f = open(r'it.txt', 'w+') # 先清空在寫 print(f.read()) f.close()f = open(r'it.txt','w+') print(f.write('hello world'))# 11 print(f.write('hello world\n'))# 12 print(f.write('hello world'))# 11print(f.tell()) # 指針?biāo)诘奈恢?/span> print(f.seek(0)) #兩個(gè)參數(shù) 一個(gè)是偏移量 f.close()執(zhí)行結(jié)果:
11 12 11 35 0注意:在Windows系統(tǒng)中 一行結(jié)束的標(biāo)志是\r\n 它會(huì)把\n轉(zhuǎn)化成\r\n
3、with open…as…(上下文件管理器)
一旦跳出這個(gè)語(yǔ)句塊 ,就自動(dòng)就幫你關(guān)掉了 ,這就是上下文管理器,with能夠自動(dòng)關(guān)閉文件,不需要執(zhí)行close方法
**實(shí)例 **
(我這里就不一一運(yùn)行了)
總結(jié):上下文管理器 不單單在文件里面有運(yùn)用,在其他的地方也用的非常平凡,文件的操作在爬蟲上用的非常之多
二、認(rèn)識(shí)異常(重點(diǎn))
在了解異常之前我們應(yīng)該了解異常是什么?
異常的本身是類的實(shí)例。
學(xué)習(xí)異常目的:異常的掌握是程序員的基本要求,以后所有的bug 都可以通過(guò)異常的學(xué)習(xí) 開始自己排查錯(cuò)誤
PEP8
1 縮進(jìn)與換行 每級(jí)縮進(jìn)使用四個(gè)空格 2 限制每行的最大長(zhǎng)度為79個(gè)字符 3 空行頂層函數(shù)和類之間使用兩個(gè)空行類的方法之間用一個(gè)空行在函數(shù)中使用空行表示不同邏輯段落 4 導(dǎo)入位于文件的頂部 5 避免多余空格 6 注釋注釋要保持與時(shí)俱進(jìn) 一句后面兩個(gè)空格 跟注釋 7 命名規(guī)范除了正常的命名規(guī)范外不要使用 大小寫的L 大寫的O 作為變量名類名首字母大寫 內(nèi)部類 加上前導(dǎo)下劃線函數(shù)名應(yīng)該小寫 增強(qiáng)可讀性可以使用下劃線分割 8 其他別用 ‘==‘ 進(jìn)行布爾值 和 True 或者 False 的比較 應(yīng)該用 is1、異常基礎(chǔ)
在 Python 中所有的異常都是繼承自 BaseException 直接分為四大類: SystemExit:Python退出異常 KeyboardInterrupt: 鍵盤打斷(Ctrl+C) GeneratorExit: 生成器退出 Exception: 普通異常(只會(huì)使用這部分的異常)除此之外還有一些我們常見的異常: NameError 變量名錯(cuò)誤 TypeError 類型錯(cuò)誤 SyntaxError 語(yǔ)法錯(cuò)誤2、異常處理
2.2.1、try/except
異常捕捉可以使用 try/except 語(yǔ)句
舉個(gè)簡(jiǎn)單的例子:
一個(gè)except子句可以同時(shí)處理多個(gè)異常,這些異常將被放在一個(gè)括號(hào)里成為一個(gè)元組,例如
except (RuntimeError, TypeError, NameError):pass當(dāng)然except也可以每次處理一個(gè)異常,就像if··elif那樣,例如:
# 捕獲具體的異常 try:a# 1/0# print(‘nihao’) # 語(yǔ)法錯(cuò)誤捕獲不到 except NameError:# 只能捕獲具體異常 漏寫的會(huì)打印出來(lái)print('類型錯(cuò)誤1') except ZeroDivisionError:print('分母不能為0') except Exception:# 代碼里邊異常的一個(gè)基類 未知異常,代碼有錯(cuò)就執(zhí)行print('未知錯(cuò)誤2')執(zhí)行結(jié)果: 類型錯(cuò)誤1 #a未定義屬于NameError類型錯(cuò)誤,所以只執(zhí)行打印類型錯(cuò)誤12.2.2、try/except…else
try/except 語(yǔ)句還有一個(gè)可選的 else 子句,如果使用這個(gè)子句,那么必須放在所有的 except 子句之后。
else 子句將在 try 子句沒有發(fā)生任何異常的時(shí)候執(zhí)行。
下面舉個(gè)簡(jiǎn)單的例子:
try:f = open('it.txt', 'r') except IOError:print('cannot open', 'it.txt') else:print('it.txt', 'has', len(f.readlines()), 'lines')f.close()執(zhí)行結(jié)果: it.txt has 1 lines2.2.3、try-finally 語(yǔ)句
ry-finally 語(yǔ)句無(wú)論是否發(fā)生異常都將執(zhí)行最后的代碼。
以下實(shí)例中 finally 語(yǔ)句無(wú)論異常是否發(fā)生都會(huì)執(zhí)行:
總結(jié):異常的處理對(duì)于我們后續(xù)的邏輯有很大的幫助,在項(xiàng)目中不會(huì)應(yīng)為個(gè)人原因或者網(wǎng)絡(luò)原因?qū)е孪到y(tǒng)的直接崩潰,而是利用對(duì)應(yīng)的錯(cuò)誤處理返回對(duì)應(yīng)的提示信息,提升產(chǎn)品的體驗(yàn)度
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的python学习笔记(九)——文件和异常(重点)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python学习笔记(八)——继承
- 下一篇: SQLite API