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:
   f.write(item)

  编码问题虽然网上的博客很多,但这个问题还是要自己遇到了在解决的过程中才能理解。

上一篇:Eclipse新建JSP文件的默认编码


下一篇:Beyond Compare 设置打开文件的默认编码