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('\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標識規范。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM