轉自: https://xrlin.github.io/解決python2.x文件讀寫編碼問題/
python2.X版本在處理中文文件讀寫時經常會遇到亂碼或者是UnicodeError錯誤,正如下面的程序所示:
#coding=utf-8
# test.txt是一個以gbk2312編碼(簡體中文windows系統中的默認文本編碼)的文本文件
# 文本寫入
with open('test.txt', 'a') as f:
f.write('test') # 正常寫入
f.write('測試') # 正常寫入,亂碼
f.write(u’測試') # 寫入錯誤,觸發UnicodeEncodeError異常
# 文本讀取
with open('test.txt') as f:
for line in f:
print line, type(line) # 輸出test嫻嬭瘯, <type 'str'>
由於腳本源文件中的字符為utf-8編碼,而文本文檔中的字符為gb2312編碼,所以以str類型字符串直接寫入文件,此時str字符串的編碼與文件編碼不同,導致亂碼。 直接str類型參數傳遞給write方法容易導致亂碼問題,直接傳遞Unicode類型字符串作為write的參數,會導致UnicodeEncodeError錯誤,這是因為python2在寫入unicode字符串時會自動嘗試轉碼為ascii編碼,而ascii編碼並不能處理中文。 知道了問題的根源,首先想到的解決方法就是對源字符串按照文件進行編碼,保證編碼正確。
# 解決方法1
with open('test.txt', 'w') as f:
f.write('測試'.decode('utf-8').encode('gb2312'))
f.write(u'測試‘.ecode('gb2312')
如果是str類型的字符串,需要使用decode(因為我在腳本中設定#coding=utf8,所以使用decode(‘utf-8’))將其改變為python內部使用的Unicde編碼然后使用encode轉換成對應的編碼類型。
讀寫操作都需要進行編碼轉換是個容易導致錯誤而且煩人的問題,python中提供了codecs這個內置自然語言處理模塊方便我們進行不同編碼語言的處理,codecs模塊的open方法可以指定encoding參數設定文件的編碼格式,以后codecs會自動處理文件的讀寫編碼問題,讀取的字符串和寫入時的字符串參數統一使用python的Unicode類型。使用codecs的open方法代替原來的open方法發可以擺脫煩人的文件編碼問題。
with codecs.open('test.txt', 'w', encoding='utf-8') as f:
f.write(u'測試')
with codecs.open('text.txt', encoding='utf-8') as f:
for line in f:
print line, type(line) # output: 測試<type 'unicode'>