Python 學習筆記: 文字檔的BOM 問題 - 小狐狸事務所
文章推薦指數: 80 %
這個BOM 問題是我在母校圖書館借的"Python 零基礎入門班 (碁峰2018, 文淵閣工作室) " 這本書中看到的, 裡面提到在Windows 系統下將檔案存成utf-8 編碼 ... 2022年9月6日星期二 Python學習筆記:文字檔的BOM問題 這個BOM問題是我在母校圖書館借的"Python零基礎入門班 (碁峰2018,文淵閣工作室)"這本書中看到的,裡面提到在Windows系統下將檔案存成utf-8編碼時,可以選擇在檔案最前方添加一個BOM(ByteOrderMark,位元組順序記號,或端序記號)字元,用來讓軟體辨識該文件是否為Unicode.關於BOM有一篇文章講得非常詳細,參考:# Python:關於Unicode的BOM摘要整理如下:BOM存在的原因來自於CPU的資料寬度從最早的8位元開始一直倍增至目前的64位元,但外部儲存媒體(DRAM/SSD/硬碟)卻一直都是8位元為一個單位,所以CPU要將資料儲存到外部時,有大端序(Big-endian)與小端序(Little-endian)兩種方式:大端序:CPU將資料位元組由LSB開始往MSB依序寫入到記憶體時,LSB會放在高位址,而MSB會放在低位址(小->大對應高->低).小端序: CPU將資料位元組由LSB開始往MSB依序寫入到記憶體時,LSB會放在低位址,而MSB會放在高位址(小->大對應低->高).目前除TCP/IP採用大端序外,大部分的軟體或協定採用小端序.其實端序問題只是資料I/O時的順序問題而已.但這與文字編碼就很有關係,因為在8位元編碼的ASCII時代,字元剛好可用一個byte表示,因此沒有I/O時的順序問題,但Unicode需要16/32位元來表示全世界文字,於是就有了外部儲存的端序問題.Unicode針對不同語言文字定義的特殊字元表叫做CodePage,Windows上預設的繁體中文用的是從Big5碼改編的 CodePage950, Unicode編碼範圍是\u0000~\u10FFFF,為了讓資料可以在採用不同端序的CPU之間交換便有了BOM的設計,這是在檔案頭添加一個0xFEFF字元(十進位是65279),此字元放入外部儲存中的順序會因為CPU使用的端序模式而不同,讀取此檔案之CPU就可以根據此字元之排列判斷其端序是否與本機相同,若不同就將剛低位元組順序顛倒,這樣即可正確解碼.16位元與32為元CPU的BOM如下: UTF-16-LE(小端序):FFFEUTF-16-BE(大端序):FEFFUTF-32-LE(小端序):FFFE0000UTF-32-BE(大端序):0000FEFFUTF-8是將以Unicode編碼的字串依照其編碼規則轉成8位元序列,所有CPU讀取時都是依位址由小到大順序讀取,故不存在端序問題,其BOM編碼為EFBBBF,這是0xFEFF字元依據UTF-8編碼規則得到的結果,事實上它的值仍然是0xFEFF. Python在處理UTF-8檔案時會自動去除與添加BOM,但也透過encoding參數指定"utf-8-sig"來保留字行處理BOM的功能.如下面測試所示. 首先開啟記事本,輸入一段文字,點選"檔案/另存新檔":檔案名稱可取名為file_without-bom.txt,編碼維持預設的UTF-8(表示不加BOM字元):然後用下列程式讀取檔案內容: >>>withopen('file_without_bom.txt','r',encoding='utf-8')asf: doc=f.readlines() print(doc) ['HelloWorld!\n','你是在說哈囉嗎?']可見讀取到的內容並無BOM字元. 將上面這個檔案另存新檔為file_with_bom.txt,編碼則選擇'具有BOM的UTF-8'(表示要在檔頭添加BOM字元): 儲存好後會看到記事本右下角顯示"具有BOM的UTF-8": 這時用上面同樣的程式去讀取就會看到這個BOM字元\ufeff:>>>withopen('file_with_bom.txt','r',encoding='utf-8')asf: doc=f.readlines() print(doc) len(doc[0]) ['\ufeffHelloWorld!\n','你是在說哈囉嗎?'] 15 這表示若寫入檔案時選擇要添加BOM字元,讀取時卻用'utf-8'編碼,則會顯示此BOM字元.若要去除此BOM字元,編碼須用'utf-8-sig',例如: >>>withopen('file_with_bom.txt','r',encoding='utf-8-sig')asf: doc=f.readlines() print(doc) len(doc[0]) ['HelloWorld!\n','你是在說哈囉嗎?']14 這樣讀取時就會將BOM字元去除,用len()檢查可知長度已經少了一個字元,變成14了. 張貼者: 小狐狸事務所 於 9/06/202211:24:00上午 以電子郵件傳送這篇文章 BlogThis! 分享至Twitter 分享至Facebook 標籤: Python 沒有留言 : 張貼留言 較新的文章 較舊的文章 首頁 訂閱: 張貼留言 ( Atom ) 總網頁瀏覽量 小狐狸事務所 載入中… 訂閱 發表文章 Atom 發表文章 留言 Atom 留言 Translate 聯絡表單 名稱 以電子郵件傳送 * 訊息 * 網誌存檔 ▼ 2022 ( 337 ) ► 10月 ( 22 ) ▼ 9月 ( 36 ) Python學習筆記:Matplotlib資料視覺化(六)物件導向篇(中) 啟用Hahow學校帳號 高科大還書3本(機器學習&DeapLearning3&Arduino自走車) Python學習筆記:Matplotlib資料視覺化(五)物件導向篇(上) Python指令出現WARNING:Ignoringinvaliddistribution問題 更新PyTorch版本至v1.12.1 部分贖回南山變額壽險(二) 2022年第39周記事 購買120W太陽能板+變流器+東元ATS Python學習筆記:用mplfinance套件繪製金融圖表(一) 2022年第38周記事 momo購買電腦椅 好書:Python網頁程式交易APP實作:Web+MySQL+Django(第二版) Python學習筆記:用Matplotlib繪製K線圖 Python學習筆記:用plotly繪製互動式圖表(一) 待借與待購書籍 看完我愛男保姆 市圖還書1本 料理實驗:雞蛋豆腐煮娃娃菜 2022年第37周記事 料理實驗:台式炒米粉 i繳費繳學雜費抽大獎 漫遊東港大鵬灣 Python學習筆記:用yfinance套件取得股票資料(二) 來去小琉球 Python學習筆記:用yfinance套件取得股票資料(一) Python學習筆記:文字檔的BOM問題 2022年第36周記事 Python學習筆記:檔案存取(一)讀寫文字檔 Python學習筆記:用csv模組讀寫csv檔 市圖還書1本(超入門實作PythonAIoT智能物聯網) 花旗信用卡點數折抵兌換方式 好站:線上Python執行平台replit.com 永豐證券ShioajiAPI Python學習筆記:安裝量化投資套件twstock與Ta-Lib 在Windows命令列用py-0檢查Python版本 ► 8月 ( 31 ) ► 7月 ( 34 ) ► 6月 ( 31 ) ► 5月 ( 35 ) ► 4月 ( 42 ) ► 3月 ( 41 ) ► 2月 ( 39 ) ► 1月 ( 26 ) ► 2021 ( 453 ) ► 12月 ( 28 ) ► 11月 ( 38 ) ► 10月 ( 43 ) ► 9月 ( 47 ) ► 8月 ( 36 ) ► 7月 ( 25 ) ► 6月 ( 38 ) ► 5月 ( 30 ) ► 4月 ( 35 ) ► 3月 ( 37 ) ► 2月 ( 41 ) ► 1月 ( 55 ) ► 2020 ( 483 ) ► 12月 ( 42 ) ► 11月 ( 33 ) ► 10月 ( 35 ) ► 9月 ( 43 ) ► 8月 ( 35 ) ► 7月 ( 30 ) ► 6月 ( 46 ) ► 5月 ( 46 ) ► 4月 ( 39 ) ► 3月 ( 48 ) ► 2月 ( 48 ) ► 1月 ( 38 ) ► 2019 ( 459 ) ► 12月 ( 38 ) ► 11月 ( 39 ) ► 10月 ( 34 ) ► 9月 ( 34 ) ► 8月 ( 27 ) ► 7月 ( 50 ) ► 6月 ( 38 ) ► 5月 ( 26 ) ► 4月 ( 51 ) ► 3月 ( 47 ) ► 2月 ( 32 ) ► 1月 ( 43 ) ► 2018 ( 394 ) ► 12月 ( 38 ) ► 11月 ( 36 ) ► 10月 ( 30 ) ► 9月 ( 33 ) ► 8月 ( 31 ) ► 7月 ( 26 ) ► 6月 ( 30 ) ► 5月 ( 48 ) ► 4月 ( 26 ) ► 3月 ( 38 ) ► 2月 ( 26 ) ► 1月 ( 32 ) ► 2017 ( 317 ) ► 12月 ( 35 ) ► 11月 ( 30 ) ► 10月 ( 24 ) ► 9月 ( 34 ) ► 8月 ( 30 ) ► 7月 ( 27 ) ► 6月 ( 28 ) ► 5月 ( 19 ) ► 4月 ( 22 ) ► 3月 ( 21 ) ► 2月 ( 30 ) ► 1月 ( 17 ) ► 2016 ( 296 ) ► 12月 ( 17 ) ► 11月 ( 23 ) ► 10月 ( 28 ) ► 9月 ( 24 ) ► 8月 ( 28 ) ► 7月 ( 33 ) ► 6月 ( 28 ) ► 5月 ( 26 ) ► 4月 ( 24 ) ► 3月 ( 24 ) ► 2月 ( 25 ) ► 1月 ( 16 ) ► 2015 ( 296 ) ► 12月 ( 18 ) ► 11月 ( 22 ) ► 10月 ( 19 ) ► 9月 ( 25 ) ► 8月 ( 27 ) ► 7月 ( 24 ) ► 6月 ( 15 ) ► 5月 ( 23 ) ► 4月 ( 32 ) ► 3月 ( 51 ) ► 2月 ( 22 ) ► 1月 ( 18 ) ► 2014 ( 323 ) ► 12月 ( 29 ) ► 11月 ( 18 ) ► 10月 ( 16 ) ► 9月 ( 15 ) ► 7月 ( 11 ) ► 6月 ( 27 ) ► 5月 ( 41 ) ► 4月 ( 38 ) ► 3月 ( 43 ) ► 2月 ( 38 ) ► 1月 ( 47 ) ► 2013 ( 267 ) ► 12月 ( 22 ) ► 11月 ( 23 ) ► 10月 ( 35 ) ► 9月 ( 28 ) ► 8月 ( 13 ) ► 7月 ( 32 ) ► 6月 ( 27 ) ► 5月 ( 13 ) ► 4月 ( 19 ) ► 3月 ( 18 ) ► 2月 ( 12 ) ► 1月 ( 25 ) ► 2012 ( 49 ) ► 12月 ( 2 ) ► 8月 ( 5 ) ► 7月 ( 5 ) ► 6月 ( 2 ) ► 5月 ( 4 ) ► 4月 ( 5 ) ► 3月 ( 4 ) ► 2月 ( 10 ) ► 1月 ( 12 ) ► 2011 ( 178 ) ► 12月 ( 9 ) ► 11月 ( 17 ) ► 10月 ( 5 ) ► 9月 ( 1 ) ► 8月 ( 7 ) ► 7月 ( 7 ) ► 6月 ( 5 ) ► 5月 ( 12 ) ► 4月 ( 29 ) ► 3月 ( 29 ) ► 2月 ( 21 ) ► 1月 ( 36 ) ► 2010 ( 201 ) ► 12月 ( 18 ) ► 11月 ( 30 ) ► 10月 ( 23 ) ► 9月 ( 8 ) ► 8月 ( 11 ) ► 7月 ( 9 ) ► 6月 ( 16 ) ► 5月 ( 14 ) ► 4月 ( 47 ) ► 3月 ( 5 ) ► 2月 ( 3 ) ► 1月 ( 17 ) ► 2009 ( 256 ) ► 12月 ( 18 ) ► 11月 ( 29 ) ► 10月 ( 6 ) ► 9月 ( 38 ) ► 8月 ( 25 ) ► 7月 ( 24 ) ► 6月 ( 17 ) ► 5月 ( 16 ) ► 4月 ( 4 ) ► 3月 ( 24 ) ► 2月 ( 34 ) ► 1月 ( 21 ) ► 2008 ( 303 ) ► 12月 ( 28 ) ► 11月 ( 18 ) ► 10月 ( 26 ) ► 9月 ( 29 ) ► 8月 ( 30 ) ► 7月 ( 62 ) ► 6月 ( 59 ) ► 5月 ( 48 ) ► 4月 ( 2 ) ► 3月 ( 1 ) 文章標籤 ♥ ( 19 ) ♥♥ ( 10 ) ♥♥♥ ( 9 ) 人工智慧 ( 86 ) 八字學 ( 1 ) 大數據 ( 6 ) 小狐狸 ( 73 ) 小狐狸生態 ( 22 ) 工作 ( 48 ) 手機 ( 29 ) 日文 ( 3 ) 木工 ( 24 ) 比特幣 ( 2 ) 主機 ( 73 ) 占星術 ( 6 ) 生活 ( 1157 ) 生活雜記 ( 8 ) 多媒體 ( 4 ) 好文 ( 6 ) 好書 ( 401 ) 好站 ( 254 ) 自作專案 ( 3 ) 自動化 ( 29 ) 系統 ( 4 ) 其他 ( 65 ) 易經 ( 1 ) 物理學 ( 10 ) 物聯網 ( 253 ) 信號處理 ( 5 ) 架站 ( 14 ) 相術 ( 2 ) 科學 ( 22 ) 英文 ( 10 ) 計算語言學 ( 3 ) 音樂 ( 73 ) 飛控 ( 25 ) 食譜 ( 72 ) 修行 ( 22 ) 借書 ( 5 ) 旅行 ( 44 ) 旅遊 ( 1 ) 書籤 ( 2 ) 索引 ( 31 ) 能源 ( 95 ) 動畫 ( 2 ) 區塊鏈 ( 3 ) 專案 ( 20 ) 排版 ( 3 ) 控制系統 ( 1 ) 教育 ( 17 ) 深度學習 ( 1 ) 理財 ( 125 ) 軟體開發 ( 8 ) 通訊 ( 3 ) 備忘 ( 2 ) 創客 ( 31 ) 單晶片 ( 30 ) 智慧音箱 ( 1 ) 無人機 ( 18 ) 硬體 ( 38 ) 紫微斗數 ( 2 ) 統計 ( 4 ) 統計學 ( 10 ) 虛擬幣 ( 3 ) 評論 ( 169 ) 量化投資 ( 14 ) 雲端 ( 21 ) 園藝 ( 1 ) 新知識 ( 1 ) 新產品 ( 1 ) 新軟體 ( 7 ) 資安 ( 7 ) 資料科學 ( 35 ) 資料庫 ( 4 ) 農業 ( 23 ) 電子零件 ( 27 ) 電子學 ( 18 ) 電腦 ( 210 ) 電腦技術 ( 12 ) 電路學 ( 1 ) 演算法 ( 8 ) 網頁技術 ( 224 ) 網路 ( 43 ) 網路爬蟲 ( 32 ) 網購 ( 328 ) 語言學 ( 55 ) 語音技術 ( 4 ) 語音辨識 ( 10 ) 影像處理 ( 1 ) 影像辨識 ( 2 ) 數學 ( 21 ) 線上工具 ( 5 ) 線性代數 ( 1 ) 論文 ( 1 ) 養生 ( 20 ) 樹莓派 ( 192 ) 機器人 ( 6 ) 機器學習 ( 158 ) 歷史 ( 60 ) 戲劇 ( 25 ) 還書 ( 125 ) 韓文 ( 1 ) 韓劇 ( 10 ) 醫藥 ( 55 ) 繪圖 ( 3 ) 藝術 ( 2 ) 讀書劄記 ( 9 ) 邏輯設計 ( 17 ) Android ( 13 ) AngularJS ( 1 ) Anime ( 1 ) App ( 30 ) Appfog ( 4 ) Arduino ( 179 ) ASP ( 11 ) AutoIt ( 15 ) AWS ( 16 ) Azure ( 1 ) BananaPi ( 3 ) BigData ( 1 ) Blynk ( 7 ) Bokeh ( 2 ) Bootstrap ( 27 ) brython ( 1 ) C語言 ( 19 ) Chart.js ( 2 ) Chatbot ( 5 ) Cheatsheet ( 2 ) CKeditor ( 1 ) Corona ( 3 ) CSS ( 10 ) D3.js ( 6 ) DataMining ( 1 ) Django ( 20 ) DSP ( 3 ) EasyUI ( 48 ) ESP32 ( 54 ) ESP8266 ( 146 ) Excel ( 11 ) ExtJS ( 24 ) Fintech ( 18 ) Firebase ( 3 ) Flask ( 3 ) FPGA ( 1 ) GAE ( 40 ) GAS ( 2 ) GCP ( 4 ) Git ( 11 ) GitHub ( 5 ) Go ( 1 ) Google ( 24 ) Highcharts ( 2 ) HomeAssistant ( 1 ) HTML5 ( 44 ) IC設計 ( 7 ) Java ( 100 ) JavaFX ( 1 ) Javascript ( 89 ) Jetson ( 11 ) Joomla ( 3 ) jqPlot ( 1 ) jQuery ( 125 ) jQueryMobile ( 30 ) jQueryUI ( 35 ) JSP ( 2 ) Julia ( 12 ) Kali ( 1 ) Keras ( 1 ) Kotlin ( 1 ) Line ( 5 ) Linux ( 15 ) LoRa ( 12 ) Lua ( 6 ) MacOS ( 11 ) Masonite ( 1 ) Mathematics ( 2 ) Matplotlib ( 9 ) mermaid.js ( 1 ) Micro:bit ( 3 ) MicroPython ( 93 ) MongoDB ( 3 ) Nginx ( 3 ) NLP ( 29 ) NLTK ( 5 ) Node.js ( 14 ) NoSQL ( 1 ) Numpy ( 1 ) OpenCV ( 2 ) p5.js ( 14 ) Pandas ( 7 ) PHP ( 109 ) Plotly ( 1 ) Praat ( 23 ) Python ( 463 ) PyTorch ( 12 ) R語言 ( 43 ) RaspberryPi ( 132 ) Ruby ( 1 ) scikit-learn ( 2 ) SciPy ( 4 ) Seaborn ( 3 ) SpaCy ( 4 ) SQL ( 15 ) SQLite ( 1 ) STM32 ( 2 ) Swift ( 6 ) TCP/IP ( 6 ) TensorFlow ( 19 ) tensorflow.js ( 3 ) Three.js ( 1 ) TinyMCE ( 1 ) tkinter ( 16 ) UAV ( 3 ) Ubuntu ( 2 ) Verilog ( 1 ) VHDL ( 1 ) VoIP ( 1 ) Vue ( 7 ) WebGL ( 3 ) Wireshark ( 2 ) WordPress ( 18 ) WSH ( 5 ) 常用連結 QR-Code產生器 爾灣分校Python函式庫 神秘金字塔 MyGitHib Google協作平台 Hinet信箱 Dropbox box Aliexpress bittrix24 CCompiler CH.Tseng G.T.Wang部落格 HomePi HTMLCleaner IBMSwiftSandbox Inside Kej'sRetriever muckibu.de OneDrive Pinterest Python機器學習 Rmanual Rapidgator TutorialsPoint VirusTotal Youtube-mp3 Zamzar線上轉檔 中華電信Hibox 台大網路測速 線上C編譯器 線上OCR 螢幕錄影 訂台鐵與高鐵票 高師大圖書館 高科大圖書館 高雄市立圖書館 線上方程式 音頻轉換器 CSS色碼表 Youtube轉mp3 熱門文章 Arduino基本語法筆記 Arduino的程式語法基於C/C++,其實就是客製化的C/C++語言,其程式架構仿自廣為藝術與設計界人士熟悉的Processing語言,而其開發工具ArduinoIDE則是衍生自以Processing為基礎的電子開發設計平台Wiring.由於... Arduino串列埠測試(UART) 今天要下午才進辦公室,早上都在家,所以研究測試了一下Arduino的串列埠,紀錄整理如下.所謂串列埠是源自IBMPC的RS-232通訊協定,也就是個人電腦後面的COM埠(9針公座DB-9),現在新的桌上型電腦與筆電大都沒有接出COM埠了,... GooglePlay安裝或更新App一直顯示"正在等待下載"問題 最近我的Note8手機要更新Yahoo股市App時一直顯示 "正在等待下載",但是進度條卻不動:我按GooglePlay左上角的三條槓選"設定",點"應用程式下載偏好設定"改... Python內建GUI模組tkinter測試(一):建立視窗 最近因為玩樹苺派的關係,接觸到Python內建的GUI開發模組Tkinter(意思是TkInterface),初步覺得比用Java的Swing還要來得容易,因此就來學看看唄!Tk原先是為Tcl語言所開發的GUI套件,因為是T... 邏輯設計筆記序向篇:Latch(電栓)與Flip-Flop(正反器) 這個月為了邏輯設計授課努力打了200多頁簡報,為了查閱方便整理在此,同時也讓我的外籍學生們可利用Google翻譯以母語複習上課內容.由於本次協同授課負責序向邏輯部分,因此先整理序向邏輯,組合邏輯以後有機會再整理.雖然說現在設計IC大都改用VHDL或V... Java複習筆記:陣列 陣列是程式員最常用的資料結構,Java的陣列屬於傳統的固定式陣列,亦即陣列元素資料類型必需相同,而且元素個數必須先宣告才能使用,不像Javascript等動態語言之陣列允許異質性資料,且長度不需先宣告即可使用.當然,Java陣列也不支援關聯性陣列,Java... jQueryUI的日期選擇器datepicker測試 近兩周都在玩jQueryUI的日曆小工具(或日期選擇器datepicker),就是讓使用者可以直接在日曆上選取日期的小工具,而且日期格式可以指定.這個widget小工具根據書上講是jQueryUI最古老,功能選項也最龐大的一個,照官網範例三兩下就看到... ★ESP8266WiFi模組ATcommand測試 這是我今年四月以$180向露天賣家XLAN買的超小型WiFi模組(現已降價為$145),採用上海樂鑫科技的ESP8266晶片,板子型式是ESP-01,這是Arduino最經濟的WiFi方案,因為目前買一塊內建WiFi的Arduin... ★ESP8266WiFi模組與Arduino連線測試 經過兩個月來的摸索,對於Arduino經由ESP8266連上網路的實驗終於來到實作階段.這當中也分心去研究如何製做ESP8266的轉接板,雖已經有腹案,但覺得還是先把連網實驗做完再來搞定轉接板好了.這兩塊板子互連主要有兩個障礙,一是開發階段串列埠不夠的問題... Arduino的聲音測試(一) 很早就想做這個實驗,因為只需要ArduinoNANO加上一個蜂鳴器就可以進行了,頂多加一顆按鈕開關,這跟物聯網無關,因此不需要用到ESP8266上網.趁著中秋連假,就把這個簡單的小實驗做完吧!以下實驗所用的程式是參考下列幾本書裡面的範例加以修改來的:... 關於我自己 小狐狸事務所 熱愛自由不想被拘束,無法忍受無聊而不斷學習的射手座,因為記性不好必須在部落格紀錄思考學習與生活點滴的平凡上班族. 檢視我的完整簡介 追蹤者
延伸文章資訊
- 1Python: 關於Unicode 的BOM - 傑克! 真是太神奇了! - 痞客邦
註一: 主要是因為可使用的編碼數只有256 個, 而不同code page 之間會對應不同的符號, 進而無法得知資訊的原始樣貌. 關於Unicode 的BOM (Byte Order Mark)...
- 2Python flat bill-of-material program based on Excel files - GitHub
A Python program for flattening a layered bill-of-material (BOM) based on Excel files. Part quant...
- 3python 讀取帶BOM的utf-8格式檔案 - 程式人生
微軟在UTF-8中使用BOM(Byte order mark)是因為這樣可以將UTF-8和ASCII等 ... 比如很多現代指令碼語言,例如python,其直譯器本身是能處理BOM的, ...
- 4Convert UTF-8 with BOM to UTF-8 with no BOM in Python
Is there a solution that can take any known Python encoding and output as UTF-8 without BOM? edit...
- 5python 读取带BOM的utf-8格式文件 - 简书
标示。比如很多现代脚本语言,例如python,其解释器本身是能处理BOM的,但是shell卡在这里。 因此我们在linux ...