這個問題來自於一個小伙伴,他在處理中文數據時需要先把里面的文本過濾然后分詞,因為里面有許多符號,不僅是中文標點符號,還有✳,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)
編碼問題雖然網上的博客很多,但這個問題還是要自己遇到了在解決的過程中才能理解。