python轉換模組codecs
0、編碼
編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字串解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。
str1.decode('gb2312') #將gb2312編碼的字串轉換成unicode編碼
str2.encode('gb2312') #將unicode編碼的字串轉換成gb2312編碼
注意事項:
s=‘中文’ 如果是在utf8的檔案中,該字串就是utf8編碼,如果是在gb2312的檔案中,則其編碼為gb2312。這種情況下,要進行編碼轉換,都需要先用decode方法將其轉換成unicode編碼,再使用encode方法將其轉換成其他編碼。
在沒有指定特定的編碼方式時,都是使用的系統預設編碼建立的程式碼檔案。
如果字串是這樣定義: s=u’中文’ 則該字串的編碼就被指定為unicode了,即python的內部編碼,而與程式碼檔案本身的編碼無關。只需要直接使用encode方法將其轉換成指定編碼即可
如果一個字串已經是unicode了,再進行解碼則將出錯,因此通常要對其編碼方式是否為unicode進行判斷isinstance(s, unicode) #用來判斷是否為unicode
1、檢視編碼方式
(1)對於我們經常使用的記事本,“檔案” -> “另存為”,可檢視到當前的編碼方式。
(2)用notepad++開啟,點選“選單欄” -> “格式”可以檢視到。
(3)UltraEdit:
不同編碼的文字,是根據文字的前兩個位元組來定義其編碼格式的,定義如下:
ANSI: 無格式定義;
Unicode: 前兩個位元組為FFFE;
Unicode big endian: 前兩位元組為FEFF;
UTF-8: 前兩位元組為EFBB;
這樣通過前面兩個位元組就可以判定出檔案的具體格式了。
2、python編碼
當python要做編碼轉換的時候,會藉助於內部的編碼,轉換過程是這樣的:
原有編碼 -> 內部編碼 -> 目的編碼
python的內部是使用unicode來處理的,但是unicode的使用需要考慮的是它的編碼格式有兩種,一是UCS-2,它一共有65536個碼位,另一種是UCS-4,它有2147483648g個碼位。
判斷安裝的python是用什麼編碼方式:
import sys
print(sys.maxunicode)
如果輸出的值為65535,那麼就是UCS-2,如果輸出是1114111就是UCS-4編碼。
轉換成內部碼:
c = "風捲殘雲"
print(type(c))
c = bytes(c,encoding='utf-8')
print(type(c))
print(c)
b = codecs. decode(c, "utf-8") #與c.decode()等效
print(type(b))
print(b)
print(c.decode())
輸出:
<class 'str'>
<class 'bytes'>
b'\xe9\xa3\x8e\xe5\x8d\xb7\xe6\xae\x8b\xe4\xba\x91'
<class 'str'>
風捲殘雲
風捲殘雲
3、codecs模組
codecs專門用作編碼轉換。通過它的介面是可以擴充套件到其他關於程式碼方面的轉換。
在python3.x中可以直接將bytes型別的資料轉換成其他編碼格式,而不用手動先轉成unicode。
import codecs
a = "我愛你"
# 建立utf-8編碼器
look = codecs.lookup('utf-8')
type(a)
a = bytes(a,encoding='utf-8')
b = look.decode(a)
print(b)
輸出:
('我愛你', 9)
返回的元組中b[0]是資料,b[1]是長度。
** 用codecs提供的open方法來指定開啟的檔案的語言編碼,它會在讀取的時候自動轉換為內部unicode**
f = codecs.open(filepath, 'r', 'utf8')
讀取方式有很多種,這裡的f是可以用for迴圈遍歷的,當然也可以直接用readline或者readlines函式方法來讀取。
#for i in f:
# print(i)
#f.readline()
#f.read()
#f.readlines()
參考自: