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 这个字符