Python讀取檔案,使用split進行分割時,出現\ufeff

來源:互聯網
上載者:User

標籤:list   文檔   unicode   template   參考   targe   解決辦法   連續   函數   

1.問題

使用python3.6對檔案讀取時,按照正常套路處理,檔案內容類別似以下:

啊啊啊 || AAA

不不不 || BBB

當使用utf-8讀取文檔並且使用split函數分割時,發現第一行字元分割後,莫名多了一個\ufeff。

因為這個原因,導致後續使用 == 或者 x in list 操作時,涉及到第一行的資料時,出錯。

Debug第一行見(第二行以後是沒問題的)

 

2.原因

參考1:

The Unicode character U+FEFF is the byte order mark, or BOM, and is used to tell the difference between big- and little-endian UTF-16 encoding

u = u‘ABC‘e8 = u.encode(‘utf-8‘)        # encode without BOM(沒考慮BOM)e8s = u.encode(‘utf-8-sig‘)   # encode with BOM(考慮了BOM)e16 = u.encode(‘utf-16‘)      # encode with BOMe16le = u.encode(‘utf-16le‘)  # encode without BOMe16be = u.encode(‘utf-16be‘)  # encode without BOM

 

參考2

\ufeff是一個特殊的標識,表明編碼方式,

位元組序,也就是位元組的順序,指的是多位元組的資料在記憶體中的存放順序,在幾乎所有的機器上,多位元組對象都被儲存為連續的位元組序列,根據資訊在連續記憶體中的儲存順序,位元組序被分為大端序(Big Endian) 與 小端序(Little Endian)兩類。( 然後就牽涉出兩大CPU派系:一派如PowerPC 970等處理器採用 Big Endian方式儲存資料,另一派如x86系列等處理器採用Little Endian方式儲存資料)。其中大端序和小端序解釋如下:

  • Big Endian 是指低地址端 存放 高位位元組。
  • Little Endian 是指低地址端 存放 低位位元組。

對其作用及更多內容見參考

3.解決方案

一種方法:

通過utf-8對字串進行encode成byte數組,然後再對該byte數組使用utf-8-sig進行decode,即:

    templateList = []    for line in open(‘templateResult.txt‘, encoding=‘utf-8‘):        tmps = line.strip().split(‘|‘)        templateList.append(tmps[0].encode(            ‘utf-8‘).decode(‘utf-8-sig‘).strip().replace(‘。‘, ‘‘))

 

另一種方法,直接使用‘utf-8-sig’開啟檔案:

    templateList = []    for line in open(‘templateResult.txt‘, encoding=‘utf-8-sig‘):        tmps = line.strip().split(‘|‘)        templateList.append(tmps[0].strip().replace(‘。‘, ‘‘))

 

  

 

4.總結

寫文檔或者讀文檔是python經常用到的操作,如使用open(‘test.txt‘,encoding=‘utf-8‘)的方式開啟文檔,當在處理第一行資料的時候可能由於自己忽略導致問題。

本文對出錯的原因及解決辦法進行了說明。

 

參考:

https://stackoverflow.com/questions/17912307/u-ufeff-in-python-string

https://songlee24.github.io/2015/05/02/endianess/

 

Python讀取檔案,使用split進行分割時,出現\ufeff

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.