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)

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

  • 相关阅读:
    [蓝桥杯][基础训练]报时助手
    [蓝桥杯][基础训练]分解质因数
    [蓝桥杯][基础训练]2n皇后问题
    [啊哈算法]我要做月老
    [啊哈算法]关键道路(图的割边)
    [啊哈算法]重要城市(图的割点)
    并查集
    栈数组与栈链表代码实现

    循环链表
  • 原文地址:https://www.cnblogs.com/baijing1/p/9885891.html
Copyright © 2011-2022 走看看