python 檔案操作和字元編碼
阿新 • • 發佈:2021-06-15
檔案的基本操作
2.1 操作檔案的套路
在計算機中要操作檔案的套路非常固定,一共包含三個步驟:
- 開啟檔案
- 讀、寫檔案
- 讀將檔案內容讀入記憶體
- 寫將記憶體內容寫入檔案
- 關閉檔案
2.2 操作檔案的函式/方法
- 在
Python
中要操作檔案需要記住 1 個函式和 3 個方法
序號 | 函式/方法 | 說明 |
---|---|---|
01 | open | 開啟檔案,並且返回檔案操作物件 |
02 | read | 將檔案內容讀取到記憶體 |
03 | write | 將指定內容寫入檔案 |
04 | close | 關閉檔案 |
open
函式負責開啟檔案,並且返回檔案物件read
/write
/close
三個方法都需要通過檔案物件來呼叫
2.3 read 方法 —— 讀取檔案
open
函式的第一個引數是要開啟的檔名(檔名區分大小寫)- 如果檔案存在,返回檔案操作物件
- 如果檔案不存在,會丟擲異常
read
方法可以一次性讀入並返回檔案的所有內容close
方法負責關閉檔案- 如果忘記關閉檔案,會造成系統資源消耗,而且會影響到後續對檔案的訪問
- 注意:
read
方法執行後,會把檔案指標移動到檔案的末尾
# 1. 開啟 - 檔名需要注意大小寫 file = open("README") # 2. 讀取 text = file.read() print(text) # 3. 關閉 file.close()
提示
- 在開發中,通常會先編寫開啟和關閉的程式碼,再編寫中間針對檔案的讀/寫
檔案指標(知道)
- 檔案指標標記從哪個位置開始讀取資料
- 第一次開啟檔案時,通常檔案指標會指向檔案的開始位置
- 當執行了
read
方法後,檔案指標會移動到讀取內容的末尾- 預設情況下會移動到檔案末尾
思考
- 如果執行了一次
read
方法,讀取了所有內容,那麼再次呼叫read
方法,還能夠獲得到內容嗎?
答案
- 不能
- 第一次讀取之後,檔案指標移動到了檔案末尾,再次呼叫不會讀取到任何的內容
2.4 開啟檔案的方式
open
函式預設以只讀方式開啟檔案,並且返回檔案物件
語法如下:
f = open("檔名", "訪問方式")
訪問方式 | 說明 |
---|---|
r | 以只讀方式開啟檔案。檔案的指標將會放在檔案的開頭,這是預設模式 |
w | 以只寫方式開啟檔案。如果檔案存在會被覆蓋。如果檔案不存在,建立新檔案 |
a | 以追加方式開啟檔案。如果該檔案已存在,檔案指標將會放在檔案的結尾。如果檔案不存在,建立新檔案進行寫入 |
r+ | 以讀寫方式開啟檔案。檔案的指標將會放在檔案的開頭。如果檔案不存在,丟擲異常 |
w+ | 以讀寫方式開啟檔案。如果檔案存在會被覆蓋。如果檔案不存在,建立新檔案 |
a+ | 以讀寫方式開啟檔案。如果該檔案已存在,檔案指標將會放在檔案的結尾。如果檔案不存在,建立新檔案進行寫入 |
提示
- 頻繁的移動檔案指標,會影響檔案的讀寫效率,開發中更多的時候會以只讀、只寫的方式來操作檔案
寫入檔案示例
# 開啟檔案 f = open("README", "w") f.write("hello python!\n") f.write("今天天氣真好") # 關閉檔案 f.close()
2.5 按行讀取檔案內容
read
方法預設會把檔案的所有內容一次性讀取到記憶體- 如果檔案太大,對記憶體的佔用會非常嚴重
readline
方法
readline
方法可以一次讀取一行內容- 方法執行後,會把檔案指標移動到下一行,準備再次讀取
讀取大檔案的正確姿勢
# 開啟檔案 file = open("README") while True: # 讀取一行內容 text = file.readline() # 判斷是否讀到內容 if not text: break # 每讀取一行的末尾已經有了一個 `\n` print(text, end="") # 關閉檔案 file.close()
2.6 檔案讀寫案例 —— 複製檔案
目標
用程式碼的方式,來實現檔案複製過程
小檔案複製
- 開啟一個已有檔案,讀取完整內容,並寫入到另外一個檔案
# 1. 開啟檔案 file_read = open("README") file_write = open("README[復件]", "w") # 2. 讀取並寫入檔案 text = file_read.read() file_write.write(text) # 3. 關閉檔案 file_read.close() file_write.close()
大檔案複製
- 開啟一個已有檔案,逐行讀取內容,並順序寫入到另外一個檔案
# 1. 開啟檔案 file_read = open("README") file_write = open("README[復件]", "w") # 2. 讀取並寫入檔案 while True: # 每次讀取一行 text = file_read.readline() # 判斷是否讀取到內容 if not text: break file_write.write(text) # 3. 關閉檔案 file_read.close() file_write.close()
03. 檔案/目錄的常用管理操作
- 在終端/檔案瀏覽器、 中可以執行常規的檔案/目錄管理操作,例如:
- 建立、重新命名、刪除、改變路徑、檢視目錄內容、……
- 在
Python
中,如果希望通過程式實現上述功能,需要匯入os
模組
檔案操作
序號 | 方法名 | 說明 | 示例 |
---|---|---|---|
01 | rename | 重新命名檔案 | os.rename(原始檔名, 目標檔名) |
02 | remove | 刪除檔案 | os.remove(檔名) |
目錄操作
序號 | 方法名 | 說明 | 示例 |
---|---|---|---|
01 | listdir | 目錄列表 | os.listdir(目錄名) |
02 | mkdir | 建立目錄 | os.mkdir(目錄名) |
03 | rmdir | 刪除目錄 | os.rmdir(目錄名) |
04 | getcwd | 獲取當前目錄 | os.getcwd() |
05 | chdir | 修改工作目錄 | os.chdir(目標目錄) |
06 | path.isdir | 判斷是否是檔案 | os.path.isdir(檔案路徑) |
提示:檔案或者目錄操作都支援相對路徑和絕對路徑
04. 文字檔案的編碼格式(科普)
- 文字檔案儲存的內容是基於字元編碼的檔案,常見的編碼有
ASCII
編碼,UNICODE
編碼等
Python 2.x 預設使用
ASCII
編碼格式
Python 3.x 預設使用UTF-8
編碼格式
4.1 ASCII 編碼和 UNICODE 編碼
ASCII
編碼
- 計算機中只有
256
個ASCII
字元 - 一個
ASCII
在記憶體中佔用1 個位元組的空間8
個0/1
的排列組合方式一共有256
種,也就是2 ** 8
UTF-8
編碼格式
- 計算機中使用1~6 個位元組來表示一個
UTF-8
字元,涵蓋了地球上幾乎所有地區的文字 - 大多數漢字會使用3 個位元組表示
UTF-8
是UNICODE
編碼的一種編碼格式
4.2 Ptyhon 2.x 中如何使用中文
Python 2.x 預設使用
ASCII
編碼格式
Python 3.x 預設使用UTF-8
編碼格式
- 在 Python 2.x 檔案的第一行增加以下程式碼,直譯器會以
utf-8
編碼來處理 python 檔案
# *-* coding:utf8 *-*
這方式是官方推薦使用的!
- 也可以使用
# coding=utf8
unicode 字串
- 在
Python 2.x
中,即使指定了檔案使用UTF-8
的編碼格式,但是在遍歷字串時,仍然會以位元組為單位遍歷字串 - 要能夠正確的遍歷字串,在定義字串時,需要在字串的引號前,增加一個小寫字母
u
,告訴直譯器這是一個unicode
字串(使用UTF-8
編碼格式的字串)
# *-* coding:utf8 *-*
# 在字串前,增加一個 `u` 表示這個字串是一個 utf8 字串 hello_str = u"你好世界" print(hello_str) for c in hello_str: print(c)