【python系統學習17】python中的文件讀寫

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 –