1. 程式人生 > >Python中讀取檔案輸出時在頭部輸出\ufeff

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標識規範。