1. 程式人生 > 其它 >python 檔案操作和字元編碼

python 檔案操作和字元編碼

檔案的基本操作

2.1 操作檔案的套路

計算機中要操作檔案的套路非常固定,一共包含三個步驟

  1. 開啟檔案
  2. 讀、寫檔案
    • 將檔案內容讀入記憶體
    • 將記憶體內容寫入檔案
  3. 關閉檔案

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編碼

  • 計算機中只有256ASCII字元
  • 一個ASCII在記憶體中佔用1 個位元組的空間
    • 80/1的排列組合方式一共有256種,也就是2 ** 8

UTF-8編碼格式

  • 計算機中使用1~6 個位元組來表示一個UTF-8字元,涵蓋了地球上幾乎所有地區的文字
  • 大多數漢字會使用3 個位元組表示
  • UTF-8UNICODE編碼的一種編碼格式

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)