利用Python读取文件时出现\ufeff的原因及解决办法
今天利用Python读取一个json文件
def read_file(file_path): file_content = "" if os.path.isfile(file_path): with open(file_path, "r", encoding='utf-8', errors='ignore') as file_obj: while 1: content_chunk = file_obj.read(1024) if not content_chunk: break file_content += content_chunk return file_content
文件是可以读取出来,出来的的json 文件是列表字符串.需要转换成列表,我是用的是eval函数
经过查看是读取出来的文件前面增加了一个\ufeff
原因分析
utf-8编码的文件时开头会有一个多余的字符\ufeff,在读文件时会读到\ufeff
输出的\ufeff到底是哪里来的呢?
在编写文本时保存时包含了BOM(Byte Order Mark,字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的编码)导致最后输出了\ufeff。
其实就是相当于你当初的文件是写在txt文件中,但是没有制定utf8编码,之后将文件改为其它后缀指定了其它编码导致
解决方案1:
再读取文件的时候使用encoding='UTF-8-sig'
解决方案2:
把原来的json文件复制出来到sublime里面使用utf8编码保存替换原来的json文件
因为我是调用的公共方法,所以尽量不对公共方法做修改,采用第二种方案.
utf-8与utf-8-sig两种编码格式有什么区别呢?
UTF-8以字节为编码单元,它的字节顺序在所有系统中都是一様的,没有字节序的问题,也因此它实际上并不需要BOM(“ByteOrder Mark”)。但是UTF-8 with BOM即utf-8-sig需要提供BOM。
\ufeff到底是什么?
字节顺序标记(英语:byte-order mark,BOM)是位于码点U+FEFF的统一码字符的名称。当以UTF-16或UTF-32来将UCS/统一码字符所组成的字符串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的记号。