利用Python读取文件时出现\ufeff的原因及解决办法

导入数据代码如下:

open("XXX.csv","r",encoding="utf-8")

数据开头显示如下:

['\ufeffclassify', 'name', 'comment', 'star', 'price', 'address', 'commentlist\n']

可见出现“\ufeff”??

原因分析

utf-8编码的文件时开头会有一个多余的字符 \ufeff,在读文件时会读到 \ufeff

解决办法

只需改一下编码就行,把 utf-8 编码 改成 utf-8-sig 编码即可

即 open("XXX.csv","r",encoding="utf-8-sig")

改后数据显示如下:

['classify', 'name', 'comment', 'star', 'price', 'address', 'commentlist\n']


\ufeff 原理分析

字节顺序标记(英语:byte-order mark,BOM)是位于码点U+FEFF的统一码字符的名称。当以UTF-16或UTF-32来将UCS/统一码字符所组成的字符串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的记号。

在编写文本时保存时包含了BOM(Byte Order Mark,字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码)导致最后输出了\ufeff。

当建立.xslx文件后又另存为.csv文件(UTF-8编码),则utf-8编码的文件时开头会有一个多余的字符\ufeff,这是我们读取文件也按UTF-8编码就会输出\ufeff。当使用 utf-8-sig 编码,即可去除文件开头的\ufeff

UTF-8以字节为编码单元,它的字节顺序在所有系统中都是一様的,没有字节序的问题,也因此它实际上并不需要BOM(“ByteOrder Mark”)。但是UTF-8 with BOM即utf-8-sig需要提供BOM。

你可能感兴趣的:(利用Python读取文件时出现\ufeff的原因及解决办法)