1. 程式人生 > >python轉換模組codecs

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()

參考自: