Python读取文件,使用split进行分割时,出现ufeff

Posted rocly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python读取文件,使用split进行分割时,出现ufeff相关的知识,希望对你有一定的参考价值。

1.问题

使用python3.6对文件读取时,按照正常套路处理,文件内容类似以下:

啊啊啊 || AAA

不不不 || BBB

当使用utf-8读取文档并且使用split函数分割时,发现第一行字符分割后,莫名多了一个ufeff

因为这个原因,导致后续使用 == 或者 x in list 操作时,涉及到第一行的数据时,出错

Debug第一行见下图(第二行以后是没问题的)

技术分享图片

 

2.原因

参考1:

The Unicode character U+FEFF is the byte order mark, or BOM, and is used to tell the difference between big- and little-endian UTF-16 encoding

u = u‘ABC‘
e8 = u.encode(‘utf-8‘)        # encode without BOM(没考虑BOM)
e8s = u.encode(‘utf-8-sig‘)   # encode with BOM(考虑了BOM)
e16 = u.encode(‘utf-16‘)      # encode with BOM
e16le = u.encode(‘utf-16le‘)  # encode without BOM
e16be = u.encode(‘utf-16be‘)  # encode without BOM

 

参考2

ufeff是一个特殊的标识,表明编码方式,

字节序,也就是字节的顺序,指的是多字节的数据在内存中的存放顺序,在几乎所有的机器上,多字节对象都被存储为连续的字节序列,根据信息在连续内存中的存储顺序,字节序被分为大端序(Big Endian) 与 小端序(Little Endian)两类。( 然后就牵涉出两大CPU派系:一派如PowerPC 970等处理器采用 Big Endian方式存储数据,另一派如x86系列等处理器采用Little Endian方式存储数据)。其中大端序和小端序解释如下:

  • Big Endian 是指低地址端 存放 高位字节。
  • Little Endian 是指低地址端 存放 低位字节。

对其作用及更多内容见参考

3.解决方法

一种方法:

通过utf-8对字符串进行encode成byte数组,然后再对该byte数组使用utf-8-sig进行decode,即:

    templateList = []
    for line in open(templateResult.txt, encoding=utf-8):
        tmps = line.strip().split(|)
        templateList.append(tmps[0].encode(
            utf-8).decode(utf-8-sig).strip().replace(, ‘‘))

 

另一种方法,直接使用‘utf-8-sig’打开文件:

    templateList = []
    for line in open(templateResult.txt, encoding=utf-8-sig):
        tmps = line.strip().split(|)
        templateList.append(tmps[0].strip().replace(, ‘‘))

 

  

 

4.总结

写文档或者读文档是python经常用到的操作,如使用open(‘test.txt‘,encoding=‘utf-8‘)的方式打开文档,当在处理第一行数据的时候可能由于自己忽略导致问题。

本文对出错的原因及解决办法进行了说明。

 

参考

https://stackoverflow.com/questions/17912307/u-ufeff-in-python-string

https://songlee24.github.io/2015/05/02/endianess/

 

以上是关于Python读取文件,使用split进行分割时,出现ufeff的主要内容,如果未能解决你的问题,请参考以下文章

进行大文件的分片操作(split),合并(cat/copy)

python split函数

python ---split()函数讲解

python 读取文件时记录读取的最后一行,下次读取时从最后一行开始读取

Python-Split()

lua文本读取账号密码分割登录