【python系統學習17】python中的檔案讀寫

xing.org1^發表於2020-08-23

python中的檔案讀寫

檔案讀寫,是Python程式碼呼叫電腦檔案的主要功能,能被用於讀取和寫入文字、音訊片段、Excel文件、郵件以及任何儲存在電腦上的東西。

可使用python批量的操作本地檔案,進行檔案的讀寫。

擴充路徑小知識

讀寫檔案需要讓計算機先找到檔案的路徑,而編寫路徑程式碼前我們人類得先準確找到檔案路徑。

以下整理路徑相關知識

相對路徑和絕對路徑

絕對路徑:就是最完整的路徑

相對路徑:指的就是【相對於當前python檔案】的路徑

路徑獲取

1、檔案拖拽的方式(mac)

要獲得你的檔案路徑,只需要把目標檔案直接拖到編輯器終端的視窗裡(我這裡用的vscode的終端。或可以用電腦自帶的命令列),就會顯示出檔案地址,然後複製一下就好。拖到終端獲取的地址是絕對路徑。 路徑獲取小知識 出現路徑: 路徑獲取小知識 只針對mac。

因為win的vscode終端裡,路徑顯示的很完整了。拷貝之後改為"\\"即可。 winDir

2、VScode裡的快捷選項

用VS Code開啟資料夾,選中檔案後點選右鍵,選擇“複製路徑”或“複製相對路徑”(mac和win通用): 路徑獲取小知識

3、pwd命令

mac電腦中,還可以在命令列中使用pwd獲取當前cmd開啟時所在資料夾的路徑。 pwd獲取當前檔案路徑

“\”在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'。

注意:如果這裡填寫的編碼型別和檔案本身的編碼格式不一致的話,就會報錯。 open檔案時編碼不正確

上圖用“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函式內容不要嘗試用數字,不然你會體會到報錯的報復: writeIntError

那我們就想寫入一個序列(列表)的話,該怎麼做呢?

使用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檔案不存在就報錯 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 -

相關文章