zoukankan      html  css  js  c++  java
  • 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'xe4xb8xadxe6x96x87'),不能直接由字符串直接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)

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

  • 相关阅读:
    制定并分享愿景 领导的艺术之一
    不要非黑即白,有些数据即使只有90%的准确,也是有用的
    双赢的思维考虑问题
    利用一切机会丰富自己的知识,利用一切机会调整自己的行为,为了达成目标而与他人合作,取得共赢 update by June 2012
    数据说话 说服别人
    对重要的事情,要很快做出反应
    You can if you think you can
    宽容的心态,开明的头脑
    DataGridView上下移动行及设置当前行
    sql 数据库、表
  • 原文地址:https://www.cnblogs.com/baijing1/p/9885891.html
Copyright © 2011-2022 走看看