zoukankan      html  css  js  c++  java
  • 利用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编码的记号。

  • 相关阅读:
    进程池的使用
    同步提交,异步提交
    协程
    单线程下实现并发的套接字
    批量上传
    TP中的session和cookie
    ajaxReturn
    ajax的两种方式
    Yii里表单的操作方法(展示渲染待续......)
    Yii里文件上传的操作方法(图片修改,在详情上展示,批量上传待续...)
  • 原文地址:https://www.cnblogs.com/csp813/p/13748682.html
Copyright © 2011-2022 走看看