1. 程式人生 > >python2 編碼問題小結

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-