1. 程式人生 > 其它 >week2 day4 字元編碼與檔案管理

week2 day4 字元編碼與檔案管理

技術標籤:python

week2 day4 字元編碼與檔案管理

在計算機的三層體系結構中,最上層是使用者/應用程式,中間層是操作程式,最底層是計算機硬體(cpu/記憶體/硬碟)。我們位於用於/應用程式那一層,我們平時使用應用程式(eg文字編輯器和python直譯器)寫入的內容(eg變數)最開始儲存在記憶體中,當我們點選儲存時,記憶體中的檔案被寫入記憶體過程中,因為計算機識別不了字元,只能識別二進位制數/八進位制數/十六進位制數,所以不管是我們在應用程式中書寫的人類的字元還是我們在螢幕上看到的顯示出來的字元,在存入記憶體/硬碟和從記憶體/硬碟中讀出時,都涉及到將字元翻譯成二進位制數,即編碼,和把二進位制數翻譯成字元,即解碼。這是我們今天內容之一——字元編碼。

檔案是作業系統提供給使用者操作計算機硬體的一種功能。實現不同功能也就產生了不同型別的檔案。如果想永久儲存資料,必須把程式碼/資料寫入檔案儲存在檔案中。這是我們內容之二——檔案管理。

一. 字元編碼

1.1 儲備知識

執行python程式的三個步驟:

  1. 啟動python直譯器
  2. 將文字檔案從硬碟載入到記憶體中
  3. python直譯器從記憶體中讀取檔案,檢查語法規範

1.2 什麼是字元編碼

檔案中的字元————>字元編碼表————>二進位制數
編碼
檔案中的字元<————字元編碼表<————二進位制數
解碼

為了解決執行python程式的2,3階段可能會出現的亂碼問題,學習字元編碼表十分重要。

1.3 字元編碼表的發展史(瞭解)

階段一:一家獨大
			ASCII碼錶:只能識別英文字元
								8位二進位制數bits/1bytes代表一個英文字元

階段二:百家爭鳴
			GBK:識別中文和英文字元
								16位二進位制數bits/1bytes代表一個字元
			shift-jis:識別日文和英文字元
			......
階段三:一統江湖
			unicode:識別萬國字元
							16位二進位制數bits/2bytes代表一個字元,不常見字元用4bytes代表。
							特點:定長字元(不管任何字元都用2bytes代替)
				utf-8:unicode的其中一種精簡版本。
							1bytes代表英文字元,3bytes代表中文字元
							特點:變長字元

unicode的出現有兩個歷史使命。一.相容萬國字元。二.相容各種字元編碼表

1.4 在儲存過程不同位置的儲存格式

cpu記憶體硬碟
英文字元(階段一)ASCII格式的二進位制ASCII格式的二進位制
中文和英文字元(階段二)gbk格式的二進位制gbk格式的二進位制
萬國字元(階段三)unicode格式的二進位制utf-8格式的二進位制

現在計算機中,萬國字元都會以unicode儲存在記憶體中,這不可更改。像python直譯器和文字編輯器中,可以更改的編碼格式是從記憶體存往硬碟的編碼格式。

1.5 常見的檔案亂碼的兩種原因及解決方法

1.檔案中包含了指定字元編碼不能識別的字元

eg.使用文字檔案編寫包含日文,中文和英文的內容。寫入記憶體時計算機指定unicode編碼,可以識別萬國字元,不會出現問題。但是當寫入硬碟時,由於windows預設使用gbk字元編碼(linuxs和mac os預設utf-8字元編碼),gbk可以識別中文和英文字元,但是無法識別日文字元,因此寫入硬碟的瞬間檔案中的日文字元無法被字元編碼表中的內容匹配,計算機會隨便匹配,這些日文書寫的內容儲存即丟失。

解決方法:儲存檔案時選用utf-8編碼格式。已亂碼的資料無法恢復。

2.讀取檔案的字元編碼表與寫檔案的字元編碼表不是同一張

eg.這種情況存入內盤和硬碟時都沒有問題,資料也沒有丟失。只是解碼的時候,拿到的字元編碼表與編碼時候的字元編碼表不是同一張。

解決方法:試錯試出當時儲存資料時選擇的字元編碼表。

二. 檔案管理

2.1 基本操作

對於檔案的操作無非就是開啟檔案,讀取檔案,寫入檔案,關閉檔案四種基本操作。我們先進行開啟檔案,讀取檔案和關閉檔案三種操作。寫入檔案稍後在2.3詳解。

  1. 開啟檔案
    先拿rt模式做示例:
f = open(r'檔案路徑',mode='rt',encoding='utf-8)

檔案路徑分為相對路徑和絕對路徑。
相對路徑是相對於當前檔案所在資料夾進行搜尋,搜尋不到則報錯。
絕對路徑對於windows來說是從碟符開始的,對linux和mac來說是從\開始的。因為在python直譯器中/和\可能有別的含義,有兩個方法解決這個問題。方法一,在整個路徑的字串前加r,可以作為純字串被讀取。方法二,重複一下\。

而mode會在2.3詳細解釋。

  1. 讀取檔案
res=f.read()
print(res)
  1. 關閉檔案
f.close()

開啟檔案完成讀/寫操作後,需要關閉檔案。

整個開啟檔案的過程是這樣的:
當python中寫下open程式碼,必須填寫的引數有檔案路徑和mode。當執行這段程式碼的時候,python應用程式會像操										作系統傳送請求,請求開啟這個檔案路徑對應的硬碟上的硬碟空間,開啟的模式就是指定的mode。然後作業系統根據具體的檔案路徑去硬碟空間上找到對應的空間,把空間裡面的內容讀入記憶體中,在作業系統中產生一個與檔名相同的檔案,同時返回給應用程式一個檔案物件f(類似遙控器)。
(open命令設計了兩方面的資源,應用程式向作業系統傳送請求,作業系統拿到請求後轉換成對於硬碟的操作)
當執行read操作時,相當於按下了遙控器上的read按鈕,馬上對作業系統傳送請求,具體的要求被作業系統轉換成了具體操作對計算機硬體執行相對操作。當執行read操作的時候(點選了遙控器上的‘read’按鈕),但是資料在硬碟和記憶體中是以不同編碼格式的二進位制的,需要把二進位制翻譯成字串,而編碼格式在open時已經指定了。
當執行close操作時,相當於點選了遙控器上的關機按鈕,即對作業系統傳送指令關閉作業系統開啟的檔案。而應用程式的檔案物件(遙控器),沒有對應的檔案,即被記憶體回收機制回收。

2.2 上下文管理with

2.3 管理檔案的模式

2.3.1 三種管理模式 r/w/a

2.3.2 管理內容的兩種模式 t/b

2.4 對檔案操作的進一步講解

2.5 指標的移動

2.6 檔案的修改