• 利用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编码的记号。

  • 相关阅读:
    nodejs生成UID(唯一标识符)——node-uuid模块
    python 3.6 关于python的介绍
    Hdu-3333 Turning Tree (离线树状数组/线段树)
    HDU-3333 Turing Tree 分块求区间不同数和
    Hello,World.
    IntelliJ IDEA 自动化工具安装并添加自动化测试框架
    git&sourcetree安装及在IntelliIJ下拉取项目基础使用
    3.jquery在js文件中获取选择器对象
    2.jquery在js中写标准的ajax请求
    操作系统简介
  • 原文地址:https://www.cnblogs.com/csp813/p/13748682.html
Copyright © 2020-2023  润新知