Python3 讀寫UTF-16/UTF-16-LE 文字檔 - Lo爸的遊戲區

文章推薦指數: 80 %
投票人數:10人

【重點寫在前面】 讀檔時: 用encoding='utf-16-le' 讀取UTF-16 文字檔時, ... 讀取UTF-16-LE 文字檔時,會發生錯誤,無法讀取;因為python 會期待有 ... 跳至內容區 josephleee Coding 17一月,201831一月,2018 1分 【重點寫在前面】 讀檔時: 用encoding=’utf-16-le’讀取UTF-16文字檔時,會誤把檔頭(BOM,也就是’\ufeff’字元)讀進變數裡。

用encoding=’utf-16′讀取UTF-16-LE文字檔時,會發生錯誤,無法讀取;因為python會期待有一個檔頭。

寫檔時: 用encoding=’utf-16′寫檔時,會自動地在檔案內容前產生一個檔頭,並寫進檔案裡。

用encoding=’utf-16-le’寫檔時,不會自動地產生檔頭。

【看看測試過程】 f16le,f16='utf16le_test.txt','utf16_test.txt' #產生檔案 withopen(f16le,'w',encoding='utf-16-le')asf1: withopen(f16,'w',encoding='utf-16')asf2: foo='\r\n'.join(['abc','123','999']) f1.write(foo) f2.write(foo) #用正確的編碼設定來讀檔 withopen(f16le,encoding='utf-16-le')asf1: withopen(f16,encoding='utf-16')asf2: b1=f1.readlines() b2=f2.readlines() #用錯誤的編碼設定來讀檔 withopen(f16,encoding='utf-16-le')asf1: withopen(f16le,encoding='utf-16')asf2: c1=f1.readlines() c2=f2.readlines() 結果: b1,b2,c1皆可正確讀取;c2無法讀取,有錯誤,Python會期待UTF-16的檔案擁有一個檔頭。

然後,我們可以用下列幾行程式來檢查Python會不會將檔頭的字元(‘\ufeff’)讀進變數中: caption='(首字元長度,首字元)' print('b1:',end='') print('%s=(%s,%s)'%(caption,len(b1[0][0]),b1[0][0])) print('b2:',end='') print('%s=(%s,%s)'%(caption,len(b2[0][0]),b2[0][0])) print('c1:',end='') print('%s=(%s,%s)'%(caption,len(c1[0][0]),c1[0][0])) 輸出結果: b1:(首字元長度,首字元)=(1,a) b2:(首字元長度,首字元)=(1,a) c1:(首字元長度,首字元)=(1,) 也就是說,只有在用encoding=’utf-16-le’讀取UTF-16檔案時,才會將檔頭讀進變數中。

然而,就實用層面而言,使用UTF-16來寫檔讀檔,python會自動幫我們處理BOM的問題,比較不容易造成使用上的混淆。

所以,為了正確的產生UTF-16文字檔,下面提供兩種等效的寫檔作法: body='Sometextcontents\nblah,blah,blah...\netc' #作法(一) withopen('file_1.txt','w',encoding='utf-16')asf: f.write(body) #作法(二) withopen('file_2.txt','w',encoding='utf-16-le')asf: f.write('\ufeff')#BOMforutf-16 f.write(body) #以後要讀檔時, #一率使用open(filename,'r',encoding='utf-16')   【結論】 用正確的編碼讀檔時,python3不會把檔頭讀進變數中。

用不正確的編碼讀檔時:encoding=’utf-16-le’會把UTF-16的檔頭(‘\ufeff’)讀進變數中;而encoding=’utf-16′無法讀取UTF-16-LE文字檔。

用encoding=’utf-16′寫檔時,會自動地在檔案內容前產生一個檔頭,並寫進檔案裡。

用encoding=’utf-16-le’寫檔時,不會自動地產生檔頭。

Ref: http://avidinsight.uk/2016/01/why-python-3-doesnt-write-the-unicode-bom/ 廣告 Sharethis:TwitterFacebook請按讚:喜歡正在載入... 相關 已加上的標籤encodingpython 發表者:josephleee 檢視「josephleee」的全部文章 已發表 17一月,201831一月,2018 文章分頁導航 前一篇Windows找不到Python?!下一篇人類的問題vs.工具的問題 發表迴響取消回覆 在此輸入你的回應… 在下方填入你的資料或按右方圖示以社群網站登入: 電子郵件(必須填寫)(電子郵件地址不會公開) 名稱(必須填寫) 個人網站 您的留言將使用WordPress.com帳號。

( 登出 /  變更 ) 您的留言將使用Twitter帳號。

( 登出 /  變更 ) 您的留言將使用Facebook帳號。

( 登出 /  變更 ) 取消 連結到%s 透過電子郵件通知我後續回應。

有新文章時用Email通知我。

Δ 搜尋: 近期文章 如何輸入附帶注音符號的字 awk筆記:用split() 將字串分段 awk筆記:用substr() 擷取字串片段 用PowerShell大量複製檔案 被欺負怎麼辦? 文章存檔 2022年五月 2021年十一月 2020年十月 2019年十二月 2018年十月 2018年六月 2018年四月 2018年一月 2017年十二月 分類 Coding 爸媽家務事 生活與人生 健康控制 思考、想法(Thoughts) 其它 註冊 登入 訂閱網站內容的資訊提供 訂閱留言的資訊提供 WordPress.com 隱私權與Cookie:此網站可使用Cookie。

繼續使用此網站即表示你同意使用Cookie。

若要瞭解更多資訊,包括如何控制Cookie,請參閱此處: Cookie政策 追蹤 已追蹤 Lo爸的遊戲區 我要註冊 已經有WordPress.com帳號了?立即登入。

Lo爸的遊戲區 自訂 追蹤 已追蹤 註冊 登入 複製短網址 回報此內容 以閱讀器檢視 管理訂閱 收合此列 %d位部落客按了讚:



請為這篇文章評分?