Python讀取文件字符編碼問題

         在使用python命令行讀取文件的時候很容易由於字符編碼造成各種問題,下面是讀取文件的的時候遇到的一個問題:

text = open("C:/Users/Administrator/Desktop/out.txt",'r')

lines = text.readlines()

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'gbk' codec can't decode byte 0xb4 in position 31: illegal multibyte sequence

       其中,關於open的編碼解釋如下:

     讀取時:內置的open()方法打開文件時,read()讀取的是str,讀取後需要使用正確的編碼格式進行decode()。write()寫入時,如果參數是unicode,則需要使用你希望寫入的編碼進行encode(),如果是其他編碼格式的str,則需要先用該str的編碼進行decode(),轉成unicode後再使用寫入的編碼進行encode()。如果直接將unicode作爲參數傳入write()方法,Python將先使用源代碼文件聲明的字符編碼進行編碼然後寫入。

    編碼時:模塊codecs提供了一個open()方法,可以指定一個編碼打開文件,使用這個方法打開的文件讀取返回的將是unicode。寫入時,如果參數是unicode,則使用open()時指定的編碼進行編碼後寫入;如果是str,則先根據源代碼文件聲明的字符編碼,解碼成unicode後再進行前述操作。相對內置的open()來說,這個方法比較不容易在編碼上出現問題。

   所以可以在讀取的時候指定編碼,這樣可以避免很多問題,如下:



# coding: GBK
 
import codecs
 
f= codecs.open('test.txt', encoding='UTF-8')
u= f.read()
f.close()
print type(u)# <type 'unicode'>
 
f= codecs.open('test.txt','a', encoding='UTF-8')
# 寫入unicode
f.write(u)
 
# 寫入str,自動進行解碼編碼操作
# GBK編碼的str
s= '漢'
print repr(s)# '\xba\xba'
# 這裏會先將GBK編碼的str解碼爲unicode再編碼爲UTF-8寫入
f.write(s)
f.close()



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章