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


轉自: 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'>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM