在使用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()