今天是持續寫作的第 12 / 100 天,
如果你有想要交流的想法、技術,歡迎在評論區留言,
本篇文章要講解的內容是 Python 檔案操作的相關內容,滾雪球學 Python 第一遍已經進行到中途,是否還能堅持住呢?加油,
已完成的文章
- 1.這才是 Python 學習的正確起手姿勢,滾雪球學 Python
- 2. 無門檻學會資料型別與輸入、輸出函式,滾雪球學 Python
- 3. 無轉折不編程,滾雪球學 Python
- 4. 串列一學完,Python 會一半,滾雪球學 Python
- 5. Python 回圈的本質就是一段代碼懶得重復寫
- 6. Python 元組,不可變的串列,滾雪球學 Python
- 7. ? 會查新華字典不?會,Python 字典已經掌握了
- 8. 秘 Python 集合三板斧,滾雪球學 Python
- 9. Python 學習程序的第一個山坡,99%的人都倒在了山坡下
- 10. 比找女朋友還難的技術點,Python 面向物件
- 11. 用別人寫好的代碼,完成我的作業,剩下的時間去摸魚
滾雪球學 Python 目錄
- 已完成的文章
- 十二、Python 檔案讀取與寫入
- 12.1 檔案夾和檔案路徑
- 12.1.1 絕對路徑和相對路徑
- 12.1.2 os 模塊與 os.path 模塊
- 12.1.3 路徑檢查方法
- 12.1.4 目錄操作
- 12.1.5 獲取檔案大小
- 12.1.6 獲取指定目錄下面的所有內容
- 12.1.7 os.walk 方法
- 12.2 Python 讀寫檔案
- 12.2.1 讀取檔案
- 12.2.2 寫入檔案
- 12.3 shutil 模塊
- 12.3.1 檔案復制
- 12.3.2 目錄復制
- 12.3.3 多用的 move 方法
- 12.3.4 洗掉有資料的目錄
- 12.4 補充知識
- 12.4.1 zipFile 模塊
- 12.4.2 認識編碼
- 12.5 這篇博客的總結
本系列文章將在 2021 年春節前完成,歡迎關注,點贊,評論 --- 夢想橡皮擦
想學 Python 爬蟲,可以訂閱橡皮擦專欄哦~ 🈲🈲🈲 點擊發現驚喜 🈲🈲🈲
十二、Python 檔案讀取與寫入
電腦檔案的操作是任何一門編程語言都會涉及的知識,本篇博客主要圍繞 Windows 電腦上的檔案操作進行說明,畢竟看到本博客內容的同學大多數都是使用的 Windows 電腦,
12.1 檔案夾和檔案路徑
檔案和檔案夾就不用說了吧,你想要學習編程肯定離不開電腦,對電腦檔案和檔案夾已經比較熟悉了,但是檔案路徑可能就不太清楚了,本文開篇先介紹一下檔案路徑相關問題,

打開你的電腦上任一檔案夾,在上圖所示位置發現的一個地址就是檔案路徑,對于電腦上任一檔案都可以用檔案路徑+檔案名訪問到,
C:\Users\Administrator\Desktop\書籍封面\abc.png
除了最后的是檔案名以外,前面的就是檔案路徑,
例如對于 abc.png 檔案,它的檔案路徑是 C:\Users\Administrator\Desktop\書籍封面,檔案路徑可稱作檔案目錄或者檔案所在檔案夾,
12.1.1 絕對路徑和相對路徑
標題的這兩個概念很有意思,在第一次學習的時候很容易就弄迷糊了,
先記住絕對路徑吧,絕對就是絕對不變的意思,
例如上述檔案 abc.png 它的絕對路徑就是硬碟上的一個不會變的地址,即 C:\Users\Administrator\Desktop\書籍封面 就是它的絕對路徑,
一般情況下理解為絕對路徑是從根目錄開始描述的路徑,
相對路徑,關鍵詞是相對,相對就是相對與當前目錄,這個需要結合案例進行學習,稍后補充,
還有兩個知識點需要補充一下,. 沒錯,就是一個點,表示的是當前檔案夾;.. 兩個點表示的是上一層檔案夾,
12.1.2 os 模塊與 os.path 模塊
在 Python 中操作檔案路徑,使用 os 模塊,os.path 模塊是 os 模塊內部的一個子模塊,首先匯入該模塊,
import os
獲取當前 Python 檔案的目錄
getcwd 方法可以獲取當前 Python 檔案所在的作業目錄,就是當前檔案在那個檔案夾中,獲取到的是絕對地址,例如下述代碼,
import os
print(os.getcwd())
**獲取絕對路徑 os.path.abspath **
os.path 模塊中的 abspath 方法可以回傳絕對路徑,可以先通過 help 函式,查看該方法使用方式,
import os
help(os.path.abspath)
注意學習回傳結果,學編程對英語要求不高,但是常見的單詞還是要認識一些的,
Help on function abspath in module ntpath:
abspath(path)
Return the absolute version of a path.
abspath 方法需要一個引數 path,即一個路徑,基于該路徑在回傳絕對路徑,
例如通過該代碼回傳 demo4.py 檔案的絕對路徑
import os
ret = os.path.abspath("demo4.py")
print(ret)
**獲取相對路徑 os.path.relpath **
絕對路徑回傳的是一個從根目錄開始的路徑值,但是相對路徑不一樣,該方法既然叫做相對,那需要有一個相對物件,所以該方法的語法格式如下:
os.path.relpath(path,start)
- path 就是要獲取絕對路徑的地址值,描述起來比較繞,一會看代碼;
- start 相對的物件值,
import os
ret = os.path.relpath("D:\\")
print(ret)
獲取 D:\\ 該目錄的相對地址,相對于誰的地址,沒寫 start 引數就相對于當前作業目錄,即 Python 檔案所在的目錄,你已經知道當前 Python 檔案所在的目錄是 D:/gun/2,
先認為的推斷一下 D:\\ 相對于 D:/gun/2 怎么獲取,應該是父級目錄的父級目錄,那用代碼怎么表示,已經學習了父級(上一層檔案夾)目錄表示方式 ..,所以寫作 ..\.. ,整理完邏輯之后,發現跟代碼得到的效果一致,
..\..
將 path 引數修改為跟 Python 檔案目錄一致的值,看一下是不是得到相對路徑是一個 .,表示當前目錄,
import os
ret = os.path.relpath("d:\\gun\\2")
# 或者寫成下面這個樣子
# ret = os.path.relpath("d:/gun/2")
print(ret)
結果輸出為 . ,沒錯是期望值,
學起來如果吃力,不要急,接著往下看,慢慢你就悟了,
12.1.3 路徑檢查方法
檢查路徑主要是為了檢查檔案或者檔案夾是否存在,或者判斷一個路徑對應的是一個檔案夾還是一個檔案,
- exists(path) 如果 path 檔案或檔案夾存在回傳 True,否則回傳 False;
- isabs(path) path 是絕對路徑回傳 True,否則回傳 False;
- isdir(path) path 是檔案夾回傳 True,否則你懂;
- isfile(path) path 是檔案回傳 True,
以上四個方法都在 os.path 模塊下,具體代碼比較簡單,自己嘗試一下即可,
12.1.4 目錄操作
以下幾個方法在 os 模塊中,執行如下操作建議先通過 os.path.exists 判斷目錄是否存在,
- mkdir(path) 創建目錄;
- rmdir(path) 洗掉目錄;
- chdir(path) 切換當前作業目錄到 path;
- remove(path) 洗掉檔案,注意如果 path 是一個目錄,洗掉會報錯,權限不足,洗掉目錄請使用
rmdir,
以上四個方法實際編碼也非常簡單,匯入模塊之后,用就完了,橡皮擦自己就先不浪費篇幅了,
12.1.5 獲取檔案大小
該內容只需要呼叫 getsize 方法即可,
import os
print(os.path.getsize("demo4.py"))
注意得到的是位元組大小,
12.1.6 獲取指定目錄下面的所有內容
通過 os.listdir 方法可以獲取指定目錄下的所有內容,包括檔案與檔案夾,
import os
print(os.listdir("."))
輸出的內容:
['demo1.py', 'demo2.py', 'demo3.py', 'demo4.py', 'demo5.py', 'dog_module.py', '__pycache__']
可以與檔案進行一下比對,

12.1.7 os.walk 方法
這個方法比較不好理解,第一次滾雪球階段還是暫時略過,該方法可以遍歷目錄樹,通過回圈就可以獲取到指定目錄下面所有的檔案與檔案夾了,但是咱不學 (^_?)☆,
12.2 Python 讀寫檔案
12.2.1 讀取檔案
Python 在讀寫檔案的時候首先要做的是打開檔案,然后可以一次性讀取檔案或者一行行的讀取,打開檔案使用 open 函式,
讀取檔案所有內容
使用 open 函式打開檔案之后,可以通過 read 讀取檔案內容,該方法相當于將檔案的內容一次性的讀取到了程式的一個字串中,非常強大,
test.txt 檔案內容
夢想橡皮擦
是一個大佬
真的是一個大佬
我自己都信了
讀取代碼如下:
# 檔案地址,注意提前在當前目錄新建一個 test.txt 檔案
file = "test.txt"
# 打開檔案
f = open(file, encoding="utf-8")
# 讀取檔案全部內容
read_str = f.read()
# 關閉檔案
f.close()
print(read_str)
第一點需要注意的是使用 open 打開檔案時,必須在檔案使用完畢之后通過 close 關閉檔案,
第二點需要注意,上述代碼中 file = "test.txt" 該檔案名并不是一個完整的路徑,這種情況下表示該檔案和當前的 Python 檔案在一個目錄,如果在不同目錄,需要用到前文講到的路徑相關知識了,
例如,在上一級目錄 ../test.txt,
上述代碼如果運行出現編碼 BUG,注意修改以下 open 函式部分代碼,通過 encoding = “utf-8” 設定檔案打開時的編碼,
# 打開檔案
f = open(file, encoding="utf-8")
逐行讀取檔案內容
通過回圈呼叫檔案物件,可以逐行輸出檔案內容,
# 檔案名
file = "test.txt"
# 打開檔案
f = open(file, encoding="utf-8")
# 回圈逐行讀取
for line in f:
print(line)
# 關閉檔案
f.close()
輸出的內容如下圖所示,

在這里逐行讀取多了一個換行,原因是在 txt 檔案中,每行的末尾默認有一個換行,print 函式輸出也會帶一個換行,所以出現 2 個回車符,解決辦法,可以使用 print 函式的第二個引數,
# 檔案名
file = "test.txt"
# 打開檔案
f = open(file, encoding="utf-8")
# 回圈逐行讀取
for line in f:
print(line,end="")
# 關閉檔案
f.close()
逐行讀取方法 readlines
使用 readlines 方法可以將資料一次性讀取到一個串列中,例如下述代碼,
# 檔案名
file = "test.txt"
# 打開檔案
f = open(file, encoding="utf-8")
# 逐行讀取
data = f.readlines()
# 關閉檔案
f.close()
print(data)
輸出內容中,可以看到每行讀取到的字串都帶一個 \n 換行符,
['夢想橡皮擦\n', '是一個大佬\n', '真的是一個大佬\n', '我自己都信了']
with 背景關系
在 Python 中為了防止忘記打開檔案之后,在進行關閉,提供了一個 with 關鍵詞解決該問題,語法格式如下:
with open(待打開檔案) as 檔案物件:
檔案操作代碼塊
有了該語法之后,前文的代碼可以修改為:
file = "test.txt"
# 打開檔案
with open(file,encoding="utf-8") as f:
# 讀取檔案全部內容
read_str = f.read()
print(read_str)
讀取檔案還包含其它的幾個方法,可以自行嘗試,
12.2.2 寫入檔案
寫入檔案,泛指寫入到本地硬碟上,
在學習寫入檔案之前,需要先擴展一下 open 函式,該函式目前已經掌握 2 個引數,第一個是操作的檔案,第二個是檔案的編碼 encoding,在補充一個檔案打開模式 mode 引數,open 函式中該引數的默認值是 r ,代碼寫作 open("text.txt",mode="r",encoding="utf-8") 表示以只讀的方式打開檔案,如果想要向檔案中寫入內容,需要將 mode 引數設定為 w,關于 mode 引數還有其它值,不要著急,后續會學習到,先記住 2 個即可,
檔案寫內容的語法格式為:
檔案物件.write(待寫入內容)
具體案例代碼:
# 檔案地址,注意提前在當前目錄新建一個 test.txt 檔案
file = "test.txt"
# 打開檔案
with open(file, mode="w", encoding="utf-8") as f:
# 寫入檔案內容
f.write("我是即將被寫入的內容")
注意,待寫入的內容需為字串型別,其它型別寫入會報錯,該種方式寫入內容之后,原內容會被覆寫,如果想要在檔案中追加資料,用到的是 mode = a,
寫入多行資料
通過 write 方法可以寫入單行資料,如果想要寫入多行資料,可以在 with 代碼塊中,寫上多個 write 方法即可,注意 write 方法默認在行尾不添加換行符,如果希望加上換行符,需手動添加,
例如下述代碼:
file = "test.txt"
# 打開檔案
with open(file, mode="w", encoding="utf-8") as f:
# 寫入檔案內容
f.write("我是即將被寫入的內容\n")
f.write("我是即將被寫入的內容")
12.3 shutil 模塊
shutil 模塊可以在 Python 代碼中快速的操作檔案,匯入該模塊使用 import shutil 即可,
12.3.1 檔案復制
使用該模塊中 shutil 物件的 copy 方法可以對檔案進行復制操作,
shutil.copy(舊檔案,新檔案)
書寫成真實代碼如下:
import shutil
shutil.copy("test.txt","aaa.txt")
shutil.copy("test.txt","../aaa.txt") # 不同目錄拷貝
12.3.2 目錄復制
copytree 方法語法格式與 copy 一致,只不過該方法是用來復制目錄的,如果目錄下面有子目錄或檔案一起復制,
import shutil
# 第一個引數是舊目錄,第二個引數是新目錄
shutil.copytree("../1","a4")
執行代碼時,需要確定新目錄不存在,如果存在會報錯,
12.3.3 多用的 move 方法
使用 move 方法可以移動檔案,
shutil.move(舊檔案,新檔案)
移動檔案一定要確保舊檔案存在,移動之后舊檔案將移動到新檔案位置,
使用 move 方法可以修改檔案名,在移動檔案的程序中,如果新舊檔案名稱不一致,可實作移動檔案并重命名的效果,
使用 move 方法還可以移動目錄,移動目錄時會將該目錄下的所有檔案一起移動,當然如果新舊目錄名稱不一致,還可以實作移動目錄并重命名的效果,
12.3.4 洗掉有資料的目錄
使用 rmtree 可以洗掉有資料的目錄,相當于直接清空該目錄下的所有目錄和檔案,再順便把該目錄也洗掉了,具體內容自行測驗即可,
12.4 補充知識
12.4.1 zipFile 模塊
通過該模塊可以直接對檔案進行壓縮與解壓操作,后續滾雪球中將補充該部分知識,
12.4.2 認識編碼
在本篇博客中主要涉及編碼的地方就是 open 函式中的 encoding 引數,我們將該引數的值設定為了 utf-8,在很多程式中設定為該值可以解決很多潛在的編碼 BUG,
本部分內容展開講解會占用很大篇幅,這里只說明以下幾點知識,
- UTF-8 這幾個字母的寫法你要記住,大小寫都可以;
- UTF-8 中有個 BOM 檔案頭,這里不細說,如果發現 UTF-8 解決不了編碼問題,那就設定為
utf-8-sig嘗試解決,
12.5 這篇博客的總結
Python 檔案操作其實核心還是對模塊的應用,熟練的使用 Python 給我們內置好的模塊能極大的提高撰寫代碼的效率,更好的完成業務上的邏輯,
想學 Python 爬蟲,可以訂閱橡皮擦專欄哦~ 🈲🈲🈲🈲 點擊發現驚喜 🈲🈲🈲🈲
🈚🈚🈚🈚🈚
如果你想跟博主建立親密關系,可以關注博主,或者關注博主公眾號“非本科程式員”,了解一個非本科程式員是如何成長的,
博主 ID:夢想橡皮擦,希望大家點贊、評論、收藏,
CSDN認證博客專家
大學老師
高級產品經理
互聯網從業者
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/229787.html
標籤:AI
