码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-11-14 01:09:03      阅读:339      评论:0      收藏:0      [点我收藏+]

标签:nes   文本   img   前置   一个   edit   对象   完整   读取   

问题出现:

在我测试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

标签:nes   文本   img   前置   一个   edit   对象   完整   读取   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!