文件概述
? 若想將應用程序獲取到的數據永久保存下來,就必須保存于硬盤中,操作系統把復雜的硬件操作封裝成簡單的接口給用戶/應用程序使用,其中文件就是操作系統提供給應用程序來操作硬盤虛擬概念,用戶或應用程序通過操作文件,可以將自己的數據永久保存下來。
-
文劍操作流程
- 打開一個文件,得到一個文件句柄并復制給變量
fp = open('a.txt',mode='r',encoding='utf-8')
- 通過文件句柄對文件進行操作
data = fp.read()
- 關閉文件
fp.colse()
-
關閉文件注意事項
? 打開一個文件包含兩部分資源,操作系統級打開的文件+應用程序的變量,在程序操作完畢一個文件后,必須把文件的這兩部分資源一個不落的回收掉,回收方法是:
fp.close()
? 但是我們經常操作完文件后,會忘記關閉文件,就會導致資源在使用,從而浪費導致程序運行慢等各種原因。
? 這里就可以使用上下文管理方式,去操作。
? 優勢:只要寫一次打開文件,當所屬句柄下的代碼執行完畢,程序結束時,會自動關閉文件,釋放資源
with open('a.txt',mode='r',encoding='utf-8') as fp: pass
-
文件編碼
? 上面我們看open打開文件的時候,括號里需要指定一些參數,先來講這里的 encoding='utf-8' ,如果打開文件時,沒有指定這個參數,默認會按系統默認的編碼打開這個文件,大多數情況下我們默認的系統編碼都是gbk,如果這個文件當初是以utf-8編碼的,這樣默認打開如果有中文很可能會得到不是你需要的結果,我們也稱之為
亂碼
.#若不想遇到亂碼問題,文件是什么格式保存的,我們就需要用什么編碼打開,推薦以后默認使用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' | 文字模式(默認) |
‘+' | 打開磁盤文件進行更新(讀寫) |
‘U' | universal newline mode (for backwards compatibility; should not be used in new code) |
- 打開文件的模式有(默認為文本模式):
r ,只讀模式【默認模式,文件必須存在,不存在則拋出異常】 w,只寫模式【不可讀;不存在則創建;存在則清空內容】 a, 之追加寫模式【不可讀;不存在則創建;存在則只追加內容】
- 對于非文本文件,我們只能使用b模式,"b"表示以字節的方式操作(而所有文件也都是以字節的形式存儲的,使用這種模式無需考慮文本文件的字符編碼、圖片文件的
jgp
格式、視頻文件的avi
格式)rb wb ab 注:以b方式打開時,讀取到的內容是字節類型,寫入時也需要提供字節類型,不能指定編碼 "+" 表示可以同時讀寫某個文件 r+, 讀寫【可讀,可寫】 w+,寫讀【可讀,可寫】 a+, 寫讀【可讀,可寫】 x, 只寫模式【不可讀;不存在則創建,存在則報錯】 x+ ,寫讀【可讀,可寫】 xb
- 由于歷史的原因,換行符在不同的系統中有不同模式,比如在
unix
中是一個\n,而在windows中是‘\r\n’,用U模式打開文件,就是支持所有的換行模式,也就說‘\r’ '\n' '\r\n'都可表示換行t是windows平臺特有的所謂text mode(文本模式),區別在于會自動識別windows平臺的換行符。
Files opened in binary mode (appending 'b' to the mode argument) return contents as bytes objects without any decoding. b是以二進制的形式來讀文件,但是顯示出來的卻不是0101,而是以字節的形式顯示出來。 一個字節是8位二進制,所以計算機是自動幫你進行了轉換。 請不要誤會b模式是按照字節讀。
-
文件的光標移動
read(3)
- 文件打開方式為文本時,代表讀取3個字符
- 文件打開方式為bytes模式時,代表三個字節,(既是一個中文字符)
其余的文件內光標移動都是以字節為單位如seek,tell,truncate
注意:
- seek有三種移動方式0,1,2,其中1和2必須在b模式下進行,但無論哪種模式,都是以bytes為單位移動的
- truncate是截斷文件,所以文件的打開方式必須可寫,但是不能用w或w+等方式打開,因為那樣直接清空文件了,所以truncate要在r+或a或a+等模式下測試效果
-
文件的修改
文件的數據是存放于硬盤上的,因而只存在覆蓋、不存在修改這么一說,我們平時看到的修改文件,都是模擬出來的效果,具體的說有兩種實現方式:
? 方式一:將硬盤存放的該文件的內容全部加載到內存,在內存中是可以修改的,修改完畢后,再由內存覆蓋到硬盤(word,vim,
nodpad++
等編輯器)import os with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: data=read_f.read() #全部讀入內存,如果文件很大,會很卡 data=data.replace('alex','SB') #在內存中完成修改 write_f.write(data) #一次性寫入新文件 os.remove('a.txt') os.rename('.a.txt.swap','a.txt')
? 方式二:講硬盤存放的該文件的內容一行一行地讀入內存,修改完畢就寫入新文件,最后用新文件覆蓋源文件
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')
-
練習
- 文件a.txt內容:每一行內容分別為商品名字,價錢,個數,求出本次購物花費的總錢數
apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
-
修改文件內容,把文件中的
alex
都替換成SB
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
