utf-8 codec cannot decode byte in position:illegal multibyte sequence 解决方案汇总

'utf-8' codec can't decode byte 0xbb in position 53: illegal multibyte sequence

  • 问题描述
  • 原因分析
  • 第一种解决方案
  • 第二种解决方案
  • 第三种解决方案
  • 总结

问题描述

博主在用python加载csv碰到了如下问题:

 'utf-8' codec can't decode byte 0xbb in position 53: illegal multibyte sequence

原因分析

就如字面意思,是因为文件中包含了utf-8无法处理的字符。

第一种解决方案

于是,博主一开始采用了多编码加载的方式尝试打开文件。思路就是,对几种主流的中文编码方式:utf8,gbk,gb2312,gb18030,cp935,big5等逐一进行尝试,并在打开后将文件保存为utf-8编码的。

#修改csv文件为utf-8的有效代码
import codecs
def handleEncoding(original_file,newfile):
    f=open(original_file,'rb+')
    content=f.read()#读取文件内容,content为bytes类型,而非string类型
    source_encoding='utf-8'
    #####确定encoding类型
    try:
        content.decode('utf-8').encode('utf-8')
        source_encoding='utf-8'
    except:
        try:
            content.decode('gbk').encode('utf-8')
            source_encoding='gbk'
        except:
            try:
                content.decode('gb2312').encode('utf-8')
                source_encoding='gb2312'
            except:
                try:
                    content.decode('gb18030').encode('utf-8')
                    source_encoding='gb18030'
                except:
                    try:
                        content.decode('big5').encode('utf-8')
                        source_encoding='gb18030'
                    except:
                        try:
                            content.decode('cp936').encode('utf-8')
                            source_encoding='cp936'
                        except:
                            content.decode('ANSI').encode('utf-8')
                            source_encoding='ANSI'
    f.close()
    
    #####按照确定的encoding读取文件内容,并另存为utf-8编码:
    block_size=4096
    with codecs.open(original_file,'r',source_encoding) as f:
        with codecs.open(newfile,'w','utf-8') as f2:
            while True:
                content=f.read(block_size)
                if not content:
                    break
                f2.write(content)

一般来说,普通的编码问题都可以通过如上代码解决,但是,博主这次处理后,还是无法打开文件。

第二种解决方案

博主还是觉得是因为Python转码失败导致的,于是进一步尝试用记事本打开后转码以及用notepad++转码,转码方式如图:

utf-8 codec cannot decode byte in position:illegal multibyte sequence 解决方案汇总_第1张图片
utf-8 codec cannot decode byte in position:illegal multibyte sequence 解决方案汇总_第2张图片

虽然已经显示转为了utf-8编码,但是,,,打开后依旧错误依旧。

第三种解决方案

常规的解决方法都有问题,那到底是哪里出了问题呢?博主尝试用同样的方法打开其他csv文件,发现,竟然!可以成功导入。

于是开始反思,欸,好像这个csv文件原本是xlsx格式的,博主直接修改后缀为.csv,会不会是因为这个问题呢?
上网搜索csv文件与xlsx文件的区别:

1.CSV是文本文件,用记事本就能打开。XLS 是二进制的文件只有用 EXCEL 才能打开;
2.CSV 文件格式只能保存活动工作表中的单元格所显示的文本和数值。XLS 中所有的数据行和字符都将保存。数据列以逗号分隔,每一行数据都以回车符结束。如果单元格中包含逗号,则该单元格中的内容以双引号引起。
3.如果单元格显示的是公式而不是数值,该公式将转换问文本方式。所有格式、图形、对象和工作表的其他内容将全部丢失。
4.若只是保存一点文本信息用,CSV 文件就可以了,但是若有设定公式,冻结列等其他东西则用 XLS。

总结一下,也就是说:不能直接简单修改拓展符.xlsx为.csv,因为这样实际上还是xlsx,而不是.csv。而xlsx本身是二进制文件,用utf-8等常规编码打开肯定有无法处理的字符!

进行一下测试,首先新建一个表格,输入三个数字,分别保存为csv以及xlsx格式:

utf-8 codec cannot decode byte in position:illegal multibyte sequence 解决方案汇总_第3张图片
用记事本打开csv:

utf-8 codec cannot decode byte in position:illegal multibyte sequence 解决方案汇总_第4张图片
记事本打开xlsx:

utf-8 codec cannot decode byte in position:illegal multibyte sequence 解决方案汇总_第5张图片
难怪,你让python直接读取这些文字,编码不出问题都难!

正确的方式应该是将内容复制到新建的表格中,选择另存为csv,即可解决:

utf-8 codec cannot decode byte in position:illegal multibyte sequence 解决方案汇总_第6张图片

总结

‘utf-8’ codec can’t decode byte 0xbb in position 53: illegal multibyte sequence,出现这类的编码问题解决方案主要有三种:①换用不同的编码形式打开②用记事本或notepad++转换编码格式再打开③检查是否是因为直接将xlsx后缀改为csv所导致的。

最后,可以的话希望大大能给我一个赞,这是我最大动力,希望能早日解决问题~~

你可能感兴趣的:(utf-8 codec cannot decode byte in position:illegal multibyte sequence 解决方案汇总)