• 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)

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

  • 相关阅读:
    BZOJ 4769: 超级贞鱼 逆序对 + 归并排序
    BZOJ 4897: [Thu Summer Camp2016]成绩单 动态规划
    luogu 4059 [Code+#1]找爸爸 动态规划
    CF718C Sasha and Array 线段树 + 矩阵乘法
    计蒜客 2238 礼物 期望 + 线段树 + 归并
    BZOJ 2157: 旅游 (结构体存变量)
    BZOJ 3786: 星系探索 ETT
    BZOJ 3545: [ONTAK2010]Peaks 启发式合并 + 离线 + Splay
    Spring的几种初始化和销毁方法
    SpringCloud之Zuul高并发情况下接口限流(十二)
  • 原文地址:https://www.cnblogs.com/baijing1/p/9885891.html
Copyright © 2020-2023  润新知