Python中读取文件输出时在头部输出ufeff

Posted tianqingzx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中读取文件输出时在头部输出ufeff相关的知识,希望对你有一定的参考价值。

问题出现:

在我测试python中的文本文件的读取与写入时,用到了字典对象来存储读出的数据。

1 std_data = dict()
2 with open(sys.argv[1], encoding=UTF-8) as fp:
3     alldata = fp.readlines()
4 for item in alldata:
5     no, name = item.rstrip(
).split()
6     std_data[no] = name
7 print(std_data)

在命令行中运行时始终存在一个开头的ufeff字符。

技术分享图片

测试了几次都如此。

后来在网上查了一下有不少的接近答案但都没有回答我心中的问题,只查到了解决方案。

1 no, name = item.encode(utf-8).decode(utf-8-sig).rstrip(
).split()

注:encode(‘utf-8‘)和decode(‘utf-8-sig‘)需要一起使用,否则会报错。

不过结果问题确实解决了。

技术分享图片

可以清晰的看到开头的特殊字符确实不见了。

然后我在百度上终于查到了一个比较完整的解释:

在Windows下用文本编辑器创建的文本文件,如果选择以UTF-8等Unicode格式保存,会在文件头(第一个字符)加入一个BOM标识。

 ok,到这一步算是有了一个原因让我信服。接着我又继续了解了一下BOM是什么鬼。

BOM = Byte Order Mark
BOM是Unicode规范中推荐的标记字节顺序的方法。比如说对于UTF-16,如果接收者收到的BOM是FEFF,表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明“我是UTF-8编码”。BOM的UTF-8编码是EF BB BF(用UltraEdit打开文本、切换到16进制可以看到)。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

 好吧,虽然不太看的懂,但是也算知道了,这是一个utf-8文本的前置说明,表明这是一个utf-8文件嘛。同时BOM也是在编码方式中的标记字节顺序的方法。

接下来学习:BOM标识规范。




以上是关于Python中读取文件输出时在头部输出ufeff的主要内容,如果未能解决你的问题,请参考以下文章

Python读取txt文件时第一行出现 ufeff 这个字符

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

python 字符串转列表出现ufeff的解决方法

文件头多了一个ufeff字符

Java非法字符: ‘ufeff‘

python文件问题