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)

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


免責聲明!

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



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