1. 程式人生 > >Python讀寫txt檔案時的編碼問題

Python讀寫txt檔案時的編碼問題

  這個問題來自於一個小夥伴,他在處理中文資料時需要先把裡面的文字過濾然後分詞,因為裡面有許多符號,不僅是中文標點符號,還有✳,emoji等奇怪的符號。

  正常情況下,中文的str經過encode('utf-8')變成bytes,然後bytes經過decode('utf-8')變回中文。

  原始檔案是txt,那麼先讀進來,需要使用utf-8編碼,當然你也可以使用GBK或者GB18030,這就看你的文本里面都是些啥內容了,讀入的格式對後面儲存的格式有重大影響,所以還是使用UTF-8吧:

  1 with open ('a.txt', 'r', encoding='utf-8') as f:   
  2   lines = f.readlines()

  接下來是一系列的操作,過濾分詞等等,然後在將結果寫入txt的時候問題來了:經過處理的一行行文字現在已經變成了str(其實裡面的內容還是這種b'\xe4\xb8\xad\xe6\x96\x87'),不能直接由字串直接decode到中文,會報錯:str has no attribute 'decode'....這是因為中間的那些操作已經把lines裡面的bytes轉成了str。所以寫入的時候需要做轉化:

  1 item.encode('utf-8').decode('utf-8')

  這種做法我在其他部落格裡都沒有見到過,主要是被逼無奈,不然str格式直接寫入就是一堆編碼,不能閱讀。原理是把原本不能直接decode的str(雖然內容是一堆編碼)先轉換回bytes,再decode成str。

  這樣就結束了嗎?NO!

  寫入之前需要開啟檔案,大部分人開啟的時候都忘記使用UTF-8編碼,而windows下txt預設的是GBK編碼,pycharm預設也是使用系統的編碼,上面要是直接寫入的話就會報錯:

  UnicodeEncodeError: 'gbk' codec can't encode character '\u2022' in position 0: illegal multibyte sequence

  即對GBK格式txt檔案寫不進去UTF-8下的部分文字,所以寫入前的開啟檔案和上面一樣:

  1 with open ('a.txt', 'w', encoding='
utf-8') as f:   2 f.write(item)

  編碼問題雖然網上的部落格很多,但這個問題還是要自己遇到了在解決的過程中才能理解。