1.codecs
模塊幫咱們在讀文件時自動轉換編碼python
要讀取非ASCII編碼的文本文件,就必須以二進制模式打開,再解碼。好比GBK編碼的文件:安全
>>> '/Users/michael/gbk.txt''rb'f = open(,)
>>> 'gbk'u = f.read().decode()
>>> u
u'\u6d4b\u8bd5'
>>> printu
測試
若是每次都這麼手動轉換編碼嫌麻煩(寫程序怕麻煩是好事,不怕麻煩就會寫出又長又難懂又無法維護的代碼),Python還提供了一個codecs
模塊幫咱們在讀文件時自動轉換編碼,直接讀出unicode:編輯器
importcodecs
with'/Users/michael/gbk.txt''r''gbk'ascodecs.open(,,)f:
# u'\u6d4b\u8bd5' f.read()
參考:函數
#coding=utf-8
"""
"""
#'ascii' codec can't encode characters in position 8-50: ordinal not in range(128)
'''
Python在安裝時,默認的編碼是ascii,當程序中出現非ascii編碼時,python的處理經常會報這樣的錯UnicodeDecodeError: 'ascii' codec can't decode byte 0x?? in position 1: ordinal not in range(128),python沒辦法處理非ascii編碼的,此時須要本身設置將python的默認編碼,通常設置爲utf8的編碼格式。
查詢系統默認編碼能夠在解釋器中輸入如下命令:
Python代碼
>>>sys.getdefaultencoding()
設置默認編碼時使用:
Python代碼
>>>sys.setdefaultencoding('utf8')
可能會報AttributeError: 'module' object has no attribute 'setdefaultencoding'的錯誤,執行reload(sys),在執行以上命令就能夠順利經過。
'''
#python代碼文件的編碼
"""
py文件默認是ASCII編碼,中文在顯示時會作一個ASCII到系統默認編碼的轉換,這時就會出錯:SyntaxError: Non-ASCII character。須要在代碼文件的第一行或第二行添加編碼指示:
# coding=utf-8 ##以utf-8編碼儲存中文字符
print ‘中文’像上面那樣直接輸入的字符串是按照代碼文件的編碼來處理的,若是用unicode編碼,有如下2種方式:
s1 = u’中文’ #u表示用unicode編碼方式儲存信息
s2 = unicode(‘中文’,’gbk’)
unicode是一個內置函數,第二個參數指示源字符串的編碼格式。
decode解碼是任何字符串具備的方法,將字符串轉換成unicode格式,參數指示源字符串的編碼格式。
encode轉碼也是任何字符串具備的方法,將字符串轉換成參數指定的格式。
python字符串的編碼
用 u’漢字’ 構造出來的是unicode類型,不用的話構造出來是str類型
str的編碼是與系統環境相關的,通常就是sys.getfilesystemencoding()獲得的值
因此從unicode轉str,要用encode方法
從str轉unicode,因此要用decode
例如:
# coding=utf-8 #默認編碼格式爲utf-8
s = u'中文' #unicode編碼的文字
print s.encode('utf-8') #轉換成utf-8格式輸出
print s #效果與上面相同,彷佛默認直接轉換爲指定編碼
個人總結:
u=u'unicode編碼文字'
g=u.encode('gbk') #轉換爲gbk格式
print g #此時爲亂碼,由於當前環境爲utf-8,gbk編碼文字爲亂碼
str=g.decode('gbk').encode('utf-8') #以gbk編碼格式讀取g(由於他就是gbk編碼的)並轉換爲utf-8格式輸出
print str #正常顯示中文
安全的方法:
s.decode('gbk','ignore').encode('utf-8′) #以gbk編碼讀取(固然是讀取gbk編碼格式的文字了)並忽略錯誤的編碼,轉換成utf-8編碼輸出
由於decode的函數原型是decode([encoding], [errors='strict']),能夠用第二個參數控制錯誤處理的策略,默認的參數就是strict,表明遇到非法字符時拋出異常;
若是設置爲ignore,則會忽略非法字符;
若是設置爲replace,則會用?取代非法字符;
若是設置爲xmlcharrefreplace,則使用XML的字符引用
"""
'''
測試說明,對於文本文件須要使用gbk解碼,而對於腳本文件須要utf8解碼,也就是說,文本文件是gbk編碼的,而腳本則是utf8
chardet模塊能夠檢測文件編碼
with open(filename) as f:
text=f.read()
print chardet.detect(text)
'''
'''
#coding:utf-8和setdefaultencoding區別
1.若是你在python中進行編碼和解碼的時候,不指定編碼方式,那麼python就會使用defaultencoding。 而python2.x的的defaultencoding是ascii,這也就是大多數python編碼報錯:「UnicodeDecodeError: 'ascii' codec can't decode byte ......」的緣由。
2.關於頭部的# coding:utf-8,有如下幾個做用
2.1若是代碼中有中文註釋,就須要此聲明
2.2比較高級的編輯器(好比個人emacs),會根據頭部聲明,將此做爲代碼文件的格式。
2.3程序會經過頭部聲明,解碼初始化 u"人生苦短",這樣的unicode對象,(因此頭部聲明和代碼的存儲格式要一致)
'''編碼