解決python2.x文件讀寫編碼問題

轉自: https://xrlin.github.io/%E8%A7%A3%E5%86%B3python2.x%E6%96%87%E4%BB%B6%E8%AF%BB%E5%86%99%E7%BC%96%E7%A0%81%E9%97%AE%E9%A2%98/

python2.X版本在處理中文文件讀寫時常常會遇到亂碼或者是UnicodeError錯誤,正以下面的程序所示:python

#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編碼並不能處理中文。 知道了問題的根源,首先想到的解決方法就是對源字符串按照文件進行編碼,保證編碼正確。git

# 解決方法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轉換成對應的編碼類型。github

讀寫操做都須要進行編碼轉換是個容易致使錯誤並且煩人的問題,python中提供了codecs這個內置天然語言處理模塊方便咱們進行不一樣編碼語言的處理,codecs模塊的open方法能夠指定encoding參數設定文件的編碼格式,之後codecs會自動處理文件的讀寫編碼問題,讀取的字符串和寫入時的字符串參數統一使用python的Unicode類型。使用codecs的open方法代替原來的open方法發能夠擺脫煩人的文件編碼問題。windows

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'>
相關文章
相關標籤/搜索