文件概述
? 若想將應(yīng)用程序獲取到的數(shù)據(jù)永久保存下來,就必須保存于硬盤中,操作系統(tǒng)把復(fù)雜的硬件操作封裝成簡單的接口給用戶/應(yīng)用程序使用,其中文件就是操作系統(tǒng)提供給應(yīng)用程序來操作硬盤虛擬概念,用戶或應(yīng)用程序通過操作文件,可以將自己的數(shù)據(jù)永久保存下來。
-
文劍操作流程
- 打開一個(gè)文件,得到一個(gè)文件句柄并復(fù)制給變量
fp = open('a.txt',mode='r',encoding='utf-8')
- 通過文件句柄對文件進(jìn)行操作
data = fp.read()
- 關(guān)閉文件
fp.colse()
-
關(guān)閉文件注意事項(xiàng)
? 打開一個(gè)文件包含兩部分資源,操作系統(tǒng)級(jí)打開的文件+應(yīng)用程序的變量,在程序操作完畢一個(gè)文件后,必須把文件的這兩部分資源一個(gè)不落的回收掉,回收方法是:
fp.close()? 但是我們經(jīng)常操作完文件后,會(huì)忘記關(guān)閉文件,就會(huì)導(dǎo)致資源在使用,從而浪費(fèi)導(dǎo)致程序運(yùn)行慢等各種原因。
? 這里就可以使用上下文管理方式,去操作。
? 優(yōu)勢:只要寫一次打開文件,當(dāng)所屬句柄下的代碼執(zhí)行完畢,程序結(jié)束時(shí),會(huì)自動(dòng)關(guān)閉文件,釋放資源
with open('a.txt',mode='r',encoding='utf-8') as fp: pass
-
文件編碼
? 上面我們看open打開文件的時(shí)候,括號(hào)里需要指定一些參數(shù),先來講這里的 encoding='utf-8' ,如果打開文件時(shí),沒有指定這個(gè)參數(shù),默認(rèn)會(huì)按系統(tǒng)默認(rèn)的編碼打開這個(gè)文件,大多數(shù)情況下我們默認(rèn)的系統(tǒng)編碼都是gbk,如果這個(gè)文件當(dāng)初是以utf-8編碼的,這樣默認(rèn)打開如果有中文很可能會(huì)得到不是你需要的結(jié)果,我們也稱之為
亂碼.#若不想遇到亂碼問題,文件是什么格式保存的,我們就需要用什么編碼打開,推薦以后默認(rèn)使用utf-8保存及編寫 f=open('a.txt','r',encoding='utf-8')
-
文件的打開模式
文件句柄 = open('文件路徑',模式)
| 模式 | 含義 |
|---|---|
| ’r‘ | open for reading(default) |
| 'w' | open for writing,truncating the file first |
| 'a' | open for writing,appending to the end of the file is exists |
| 'b' | binary mode |
| ‘t' | 文字模式(默認(rèn)) |
| ‘+' | 打開磁盤文件進(jìn)行更新(讀寫) |
| ‘U' | universal newline mode (for backwards compatibility; should not be used in new code) |
- 打開文件的模式有(默認(rèn)為文本模式):
r ,只讀模式【默認(rèn)模式,文件必須存在,不存在則拋出異常】 w,只寫模式【不可讀;不存在則創(chuàng)建;存在則清空內(nèi)容】 a, 之追加寫模式【不可讀;不存在則創(chuàng)建;存在則只追加內(nèi)容】
- 對于非文本文件,我們只能使用b模式,"b"表示以字節(jié)的方式操作(而所有文件也都是以字節(jié)的形式存儲(chǔ)的,使用這種模式無需考慮文本文件的字符編碼、圖片文件的
jgp格式、視頻文件的avi格式)rb wb ab 注:以b方式打開時(shí),讀取到的內(nèi)容是字節(jié)類型,寫入時(shí)也需要提供字節(jié)類型,不能指定編碼 "+" 表示可以同時(shí)讀寫某個(gè)文件 r+, 讀寫【可讀,可寫】 w+,寫讀【可讀,可寫】 a+, 寫讀【可讀,可寫】 x, 只寫模式【不可讀;不存在則創(chuàng)建,存在則報(bào)錯(cuò)】 x+ ,寫讀【可讀,可寫】 xb
- 由于歷史的原因,換行符在不同的系統(tǒng)中有不同模式,比如在
unix中是一個(gè)\n,而在windows中是‘\r\n’,用U模式打開文件,就是支持所有的換行模式,也就說‘\r’ '\n' '\r\n'都可表示換行t是windows平臺(tái)特有的所謂text mode(文本模式),區(qū)別在于會(huì)自動(dòng)識(shí)別windows平臺(tái)的換行符。
Files opened in binary mode (appending 'b' to the mode argument) return contents as bytes objects without any decoding. b是以二進(jìn)制的形式來讀文件,但是顯示出來的卻不是0101,而是以字節(jié)的形式顯示出來。 一個(gè)字節(jié)是8位二進(jìn)制,所以計(jì)算機(jī)是自動(dòng)幫你進(jìn)行了轉(zhuǎn)換。 請不要誤會(huì)b模式是按照字節(jié)讀。
-
文件的光標(biāo)移動(dòng)
read(3)
- 文件打開方式為文本時(shí),代表讀取3個(gè)字符
- 文件打開方式為bytes模式時(shí),代表三個(gè)字節(jié),(既是一個(gè)中文字符)
其余的文件內(nèi)光標(biāo)移動(dòng)都是以字節(jié)為單位如seek,tell,truncate
注意:
- seek有三種移動(dòng)方式0,1,2,其中1和2必須在b模式下進(jìn)行,但無論哪種模式,都是以bytes為單位移動(dòng)的
- truncate是截?cái)辔募晕募拇蜷_方式必須可寫,但是不能用w或w+等方式打開,因?yàn)槟菢又苯忧蹇瘴募耍詔runcate要在r+或a或a+等模式下測試效果
-
文件的修改
文件的數(shù)據(jù)是存放于硬盤上的,因而只存在覆蓋、不存在修改這么一說,我們平時(shí)看到的修改文件,都是模擬出來的效果,具體的說有兩種實(shí)現(xiàn)方式:
? 方式一:將硬盤存放的該文件的內(nèi)容全部加載到內(nèi)存,在內(nèi)存中是可以修改的,修改完畢后,再由內(nèi)存覆蓋到硬盤(word,vim,
nodpad++等編輯器)import os with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: data=read_f.read() #全部讀入內(nèi)存,如果文件很大,會(huì)很卡 data=data.replace('alex','SB') #在內(nèi)存中完成修改 write_f.write(data) #一次性寫入新文件 os.remove('a.txt') os.rename('.a.txt.swap','a.txt')? 方式二:講硬盤存放的該文件的內(nèi)容一行一行地讀入內(nèi)存,修改完畢就寫入新文件,最后用新文件覆蓋源文件
import os with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: for line in read_f: line=line.replace('alex','SB') write_f.write(line) os.remove('a.txt') os.rename('.a.txt.swap','a.txt')
-
練習(xí)
- 文件a.txt內(nèi)容:每一行內(nèi)容分別為商品名字,價(jià)錢,個(gè)數(shù),求出本次購物花費(fèi)的總錢數(shù)
apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
-
修改文件內(nèi)容,把文件中的
alex都替換成SB
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

