python2 編碼問題小結
在python讀取txt和excel檔案時,經常遇到編碼格式不一致,導致檔案無法寫入或讀取後進行正確的判斷。下面對檔案的編碼格式進行簡單的總結
一、字元編碼介紹
1. Iso8859-1
Iso8859-1是單位元組編碼,和ascii編碼類似。最多表示的字元範圍是0-255,應用於英文系列。
2. BGK
GBK是漢字的國際編碼,專門用來表示漢字的,屬於雙位元組編碼。其中gbk能同時編碼簡體漢字和繁體漢字。gbk2312只能編碼簡體字。
3. Unicode
Unicode是最統一的編碼,可以用來編碼所有的語言的字元,並且是定長雙位元組的編碼(也有四位元組編碼)。因此,unicode是不相容iso8859-1編碼,也不相容任何編碼。
但是,定長編碼便於計算機處理(但是gbk編碼不是定長),因此現在大多數軟體內部使用unicode編碼。
4.UTF(儲存格式)
因為unicode編碼不相容iso8859-1編碼,並且定長編碼容易造成空間浪費,所以,unicode編碼不便於傳輸以及儲存。utf編碼是不定長編碼,每一個字元的長度從1-6個位元組不等(一般來說,英文字母使用一個位元組表示,漢字使用三個位元組表示),且相容iso8859-1編碼。
注:utf編碼能節省空間是相對於unicode而言。但對於漢字的網頁,utf編碼依然比unicode編碼更省空間。因為,漢字網頁中充斥著大量的英文字元。對於純漢字而言,gbk編碼比utf編碼節省空間
二、Python 2中的問題
1. 如何檢測python中字元的編碼格式
Python中有一個chardet模組用於檢測字元的編碼格式。
用法:import chardet
chardet.detct(xxx)
該函式返回一個字典{‘encoding’:xxx,’confidence’:0-1},包括該字元的編碼格式,以是該編碼的置信度
2. Python 中的編碼轉化
Unicode將所有的字元都對應上了相應的碼點,而utf-8或ascii不過是對應從unicode到位元組的對映方式。有對映方式,就有對映方向。把從unicode到位元組碼(byte string)稱為encode,把從位元組碼(byte string)到unicode碼稱為decode。
3. encode和decode的用法
先看看decode和encode的語法:
a) decode()方法語法:
str.decode(encoding = “utf-8”,errors = “strict”)
引數:
encoding : 要使用的編碼,如“utf-8”
errors: 設定不同的錯誤處理方案。預設為“strict”,意為編碼錯誤引起一個UnicodeError。“ignore”則會忽略非法字元;
“replace”則會用?取代非法字元;“xlmlcharrefreplace”則使用XML字元引用
b) encode()方法語法
str.encode(encoding = “utf-8”,errors= “strict”
三、讀寫檔案
一般我們使用python中內建的open()方法開啟檔案時,read()讀取的是str,讀取後需要使用正確的編碼格式進行decode()。Write()寫入時,如果引數是unicode,則需要使用希望寫入的編碼進行encode()。
如果是其他編碼格式的str,則需要先用該str進行decode(),轉化成unicode後,再使用寫入的編碼進行encode。即:將非unicode編碼的str,轉化為unicode編碼格式的str。
如果直接將unicode作為次數傳入write方法,首先要使用原始碼檔案的字元編碼進行編碼。
四、編碼宣告
#encoding:utf-8的作用:
py檔案是不支援中文的,即使是中文註釋也是不行的。utf-8宣告是把檔案的編碼型別改為utf-