python中的檔案讀寫
檔案讀寫,是Python程式碼呼叫電腦檔案的主要功能,能被用於讀取和寫入文字、音訊片段、Excel文件、郵件以及任何儲存在電腦上的東西。
可使用python批量的操作本地檔案,進行檔案的讀寫。
擴充路徑小知識
讀寫檔案需要讓計算機先找到檔案的路徑,而編寫路徑程式碼前我們人類得先準確找到檔案路徑。
以下整理路徑相關知識
相對路徑和絕對路徑
絕對路徑:就是最完整的路徑
相對路徑:指的就是【相對於當前python檔案】的路徑
路徑獲取
1、檔案拖拽的方式(mac)
要獲得你的檔案路徑,只需要把目標檔案直接拖到編輯器終端的視窗裡(我這裡用的vscode的終端。或可以用電腦自帶的命令列),就會顯示出檔案地址,然後複製一下就好。拖到終端獲取的地址是絕對路徑。 出現路徑: 只針對mac。
因為win的vscode終端裡,路徑顯示的很完整了。拷貝之後改為"\\"即可。
2、VScode裡的快捷選項
用VS Code開啟資料夾,選中檔案後點選右鍵,選擇“複製路徑”或“複製相對路徑”(mac和win通用):
3、pwd命令
mac電腦中,還可以在命令列中使用pwd
獲取當前cmd開啟時所在資料夾的路徑。
“\”在python中需要轉義
特殊的:Windows系統裡,常用“\”來表示絕對路徑,但是“\”在python中是轉義字元,所以時常會有衝突。為了避坑,Windows的絕對路徑通常要稍作處理,寫成類似以下兩種形式:
#第一種:將'\'替換成'\\'
'C:\\Users\\Ted\\Desktop\\test\\abc.txt'
#第二種:在路徑前加上字母r
r'C:\Users\Ted\Desktop\test\abc.txt'
讀取檔案
問,把大象放到冰箱需要幾步? 答:開啟冰箱 - 放入大象 - 關上冰箱
再問,讀取檔案需要幾步? 答:開啟檔案 - 讀取資訊 - 關閉檔案
開啟檔案
使用open()
函式開啟檔案
openResult = open('/Users/.../demo.txt','r',encoding='utf-8')
# openResult變數用於存放open讀取的檔案資料,以便對其進行後續操作。
open各引數說明:
引數 | 說明 |
---|---|
地址引數 | open函式內的第一個引數,表示檔案的路徑。可以是絕對路徑、也可以是相對路徑。 |
r | 第二個參數列示開啟檔案的模式。這裡是字串 'r',表示 read,表示我們以讀的模式開啟了這個檔案。 |
encoding='utf-8' | 表示的是返回的資料採用何種編碼,一般採用'utf-8'或者'gbk'。 |
注意:如果這裡填寫的編碼型別和檔案本身的編碼格式不一致的話,就會報錯。
上圖用“utf-8”編碼模式開啟,但是文字的編碼實際是“ANSI”。就報了這種錯誤。
讀取
用read()
函式將整個檔案一次性讀取出來
readResult = openResult.read() # 檔案讀取後的字串內容賦值給readResult變數
print(readResult) # 可以列印出讀取的內容
read() 會從txt檔案取出全部內容,是一個字串。
用readlines()
函式逐行讀取檔案的內容
readResult = openResult.readlines() # 逐行讀取
print(readResult)
readlines() 會從txt檔案取得一個列表,列表中的每個字串就是讀取的檔案中的每一行。而且每個字串後面還有換行的\n符號。
如有txt檔案,內容如下:
小石頭 100 93 83
郭菊鋒 89 67 9
xing.org1^ 23 48 100
則用上邊的程式碼readlines()讀取後,列印readResult的結果就是長這樣的:
['小石頭 100 93 83\n', '郭菊鋒 89 67 9\n', 'xing.org1^ 23 48 100']
這樣就可以用for迴圈遍歷列表,逐行處理資料。(具體做法可以看最後邊的小練習)
關閉檔案
使用的是close()函式
openResult.close() # 直接關閉即可
檔案關閉的必要性:
1.計算機能夠開啟的檔案數量是有限制的,open()過多而不close()的話,就不能再開啟檔案了。
2.能保證寫入的內容已經在檔案裡被儲存好了。
檔案關閉之後就不能再對這個檔案進行讀寫了。 如果還需要讀寫這個檔案的話,就要再次 open() 開啟這個檔案。
讀取檔案總結三步
openResult = open('/Users/.../demo.txt','r',encoding='utf-8') # 1、開啟
readResult = openResult.read() # 2、讀取
print(readResult) # 2+1、可以對讀取的檔案進行使用操作
openResult.close() # 3、關閉
檔案寫入
問,把大象放到冰箱需要幾步? 答:開啟冰箱 - 放入大象 - 關上冰箱
再問,檔案寫入需要幾步? 答:開啟檔案 - 寫入資訊 - 關閉檔案
開啟檔案
同樣還是使用open()函式開啟檔案
但第二個引數,開啟的模式要改變一下:
openResult = open('/Users/.../demo.txt','w',encoding='utf-8')
# openResult變數用於存放open開啟的檔案的資料,以便對其進行後續操作。
或者另一種寫法:
openResult = open('/Users/.../demo.txt','a',encoding='utf-8')
open各引數說明(其他引數見上邊表格,這裡重點說第二個引數):
引數 | 說明 |
---|---|
w | 第二個參數列示開啟檔案時的模式。字串'w'表示 write,即以寫入的模式開啟檔案。不過值得注意的是,‘w’是覆蓋式寫入,新write的內容會覆蓋該檔案原有的內容。表現上就是先清空檔案內容,再寫入。 |
a | 字串'a'表示append,顧名思義,就是向後追加的意思。其和'w'作用一樣都是向檔案中寫入的模式。不過append更人性化的是,向原有檔案的內容之後追加內容,而不是直接覆蓋原始檔的內容。 |
在'w'和'a'模式下,如果你開啟的檔案不存在,那麼open()函式會自動幫你建立一個,不會報錯。
寫入
使用write()
函式往檔案中寫入一個內容
openResult.write('小石頭\n') # 向openResult中寫入內容。write引數必須是字串,表示要寫入的內容
openResult.write('xing.org1^\n') # \n表示換行符。
print(openResult)
注意,寫入時,write函式內容不要嘗試用數字,不然你會體會到報錯的報復:
那我們就想寫入一個序列(列表)的話,該怎麼做呢?
使用writelines()
函式向文字中寫入序列內容
listVal = ['小石頭\n', 'xing.org1^\n'] # 一個待寫入的列表。要換行還要自己加入換行符
openResult.writelines(listVal) # writelines引數接受一個序列
關閉檔案
關閉檔案,依舊使用close()函式
openResult.close() # 直接關閉即可
總結三步
重寫檔案內容:
# 用write模式開啟檔案
openResult = open('/Users/.../demo.txt','w',encoding='utf-8') # 1、開啟(write)
openResult.write('小石頭\n') # 2、覆蓋原始檔內容、寫入
openResult.write('xing.org1^\n')
openResult.close() # 3、關閉
或者,追加內容:
# 用append模式開啟檔案
openResult = open('/Users/.../demo.txt','a',encoding='utf-8') # 1、開啟(append)
openResult.write('小石頭\n') # 2、向原始檔內容之後追加、寫入
openResult.write('xing.org1^\n')
openResult.close() # 3、關閉
此時可以觀察,txt檔案裡的內容已經被修改了
open函式
開啟檔案的幾種模式
參照上邊的程式碼,open函式呼叫時,第二個引數就需要傳入是r還是w亦或者是其他模式,表示只讀還是隻寫還是其他等等。
為什麼開啟的時候就要決定是讀還是寫的模式,之後決定不行嗎?
這是因為,計算機非常注意資料的保密性,在開啟時就要決定以什麼模式開啟檔案。
而除了'r',還有'w'(寫入),'a'(追加)等模式,詳見下表:
模式 | 全寫 | 含義 | 說明 | 檔案不存在 |
---|---|---|---|---|
r | read | 只讀模式 | 讀取檔案 | 檔案不存在就報錯, 檔案存在指標在開頭 從頭開始,掃描讀取 |
w | write | 只寫模式 | 覆蓋原始檔,寫入新資料 | 檔案不存在就新建, 存在就覆蓋 |
a | append | 追加模式 | 在原始檔內容的基礎上 追加寫入新內容 |
檔案不存在新建, 存在指標放到末尾追加內容 |
read檔案不存在就報錯
二進位制資源讀寫
w和a寫入的都是文字內容。
如果想寫入圖片、視訊、音訊等這些以二進位制形式進行儲存的資源內容時,需要使用‘wb’這些以二進位制的方式開啟並讀寫文字的模式。
模式 分類 |
普通 模式 |
b (bytes,位元組) |
+ | b+ | 檔案 不存在 |
---|---|---|---|---|---|
read (讀取) |
r 只讀 | rb 二進位制只讀 | r+ 讀寫 | rb+ 二進位制讀寫 | 報錯 |
write (寫入) |
w 只寫 | wb 二進位制只寫 | w+ 讀寫 | wb+ 二進位制讀寫 | 新建檔案 |
append (追加) |
a 追加 | ab 二進位制追加 | a+ 追加且可讀 | ab+ 二進位制追加且可讀 | 新建檔案 |
with關鍵字
使用with
配合open函式來讀取檔案,可以不用寫close()來關閉檔案。這樣可以防止我們程式碼最後忘記關閉檔案或頻繁關閉檔案,造成資源佔用或程式碼冗餘的情況。
格式
with open() as xxx:
語法
with open('檔案地址','讀寫模式') as 變數名: #格式:注意冒號
變數名.write('寫入內容') #冒號下對檔案的操作要縮排
#最後無需用close()關閉
寫法
with open('./demo.txt','a') as openResult:
openResult.write('小石頭')
python克隆圖片
原理,用python讀取一個圖片檔案,然後再寫入一個新的圖片檔案。實現圖片的拷貝克隆功能。
with open('photo1.png', 'rb') as photo1: # 開啟原圖photo1.png,rb只讀二進位制資源模式
result = photo1.read() # 將讀取結果賦值給result
with open('photo2.jpg', 'wb') as photo2: # 開啟新圖photo2.jpg,wb只寫模式,沒有該檔案將建立一個新檔案。
photo2.write(result) # 建立的新檔案中,寫入photo1的資料,實現圖片克隆。
小練習
檔案讀寫操作小練習:
本地一個demo.txt檔案,檔案內容如下:
<!-- 原來的,demo.txt檔案內容 -->
小石頭 100 93 83
郭菊鋒 89 67 9
xing.org1^ 23 48 100
分別是三個人的語文、數學、英語成績。
練習目標是讀取檔案後計算三人的總成績。然後寫到demo檔案下,生成格式如:
<!-- 修改後,demo.txt檔案內容 -->
小石頭 100 93 83
郭菊鋒 89 67 9
xing.org1^ 23 48 100
總分:
小石頭 276
郭菊鋒 165
xing.org1^ 171
- END -