首页 > 编程语言 > 详细

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

时间:2018-11-14 00:22:03      阅读:188      评论:0      收藏:0      [点我收藏+]

问题出现:

在我测试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(\n).split()
6     std_data[no] = name
7 print(std_data)

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

技术分享图片

测试了几次都如此。

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

1 no, name = item.encode(utf-8).decode(utf-8-sig).rstrip(\n).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

原文:https://www.cnblogs.com/tianqingzx/p/9955680.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!