在Python中將帶BOM的UTF - 程式人生

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

我想將它們(理想情況下)轉換為沒有BOM的UTF-8。

似乎 codecs.StreamRecoder(stream, encode, decode, Reader, Writer, errors) 將處理此問題。

但是我真的看不 ... 程式人生>python>在Python中將帶BOM的UTF 【python】在Python中將帶BOM的UTF 阿新••發佈:2020-10-25 這裡有兩個問題。

我有一組通常是帶有BOM的UTF-8檔案。

我想將它們(理想情況下)轉換為沒有BOM的UTF-8。

似乎codecs.StreamRecoder(stream,encode,decode,Reader,Writer,errors)將處理此問題。

但是我真的看不到任何有關用法的好例子。

這將是處理此問題的最佳方法嗎?sourcefiles: TueJan17$filebrh-m-157.json brh-m-157.json:UTF-8Unicode(withBOM)text 同樣,如果我們能夠處理清楚知道的不同輸入編碼(看到的ASCII和UTF-16),那將是理想的。

看來這一切都是可行的。

是否有一種解決方案可以採用任何已知的Python編碼並以UTF-8格式輸出而無需BOM?編輯1從下面建議的sol'n(謝謝!)fp=open('brh-m-157.json','rw') s=fp.read() u=s.decode('utf-8-sig') s=u.encode('utf-8') printfp.encoding fp.write(s) 這給了我以下錯誤:IOError:[Errno9]Badfiledescriptor 新聞快訊有人在評論中告訴我,錯誤是我以'rw'模式而不是'r+'/'r+b'模式開啟檔案,因此我最終應重新編輯問題並刪除已解決的部分。

解決辦法 只需使用"utf-8-sig"codec:fp=open("file.txt") s=fp.read() u=s.decode("utf-8-sig") 這樣就可以得到一個沒有BOM的unicode字串。

然後,您可以使用s=u.encode("utf-8") 返回到s中的普通UTF-8編碼字串。

如果檔案很大,則應避免將它們全部讀入記憶體。

BOM只是檔案開頭的三個位元組,因此您可以使用以下程式碼將其從檔案中刪除:importos,sys,codecs BUFSIZE=4096 BOMLEN=len(codecs.BOM_UTF8) path=sys.argv[1] withopen(path,"r+b")asfp: chunk=fp.read(BUFSIZE) ifchunk.startswith(codecs.BOM_UTF8): i=0 chunk=chunk[BOMLEN:] whilechunk: fp.seek(i) fp.write(chunk) i+=len(chunk) fp.seek(BOMLEN,os.SEEK_CUR) chunk=fp.read(BUFSIZE) fp.seek(-BOMLEN,os.SEEK_CUR) fp.truncate() 它開啟檔案,讀取一個塊,並將其比讀取它的位置早3個位元組寫入檔案。

該檔案被原位重寫。

更為簡便的解決方案是將較短的檔案寫入到像newtover'sanswer這樣的新檔案中。

那會更簡單,但是在短時間內使用兩倍的磁碟空間。

至於猜測編碼,則可以從最具體到最不具體遍歷整個編碼:defdecode(s): forencodingin"utf-8-sig","utf-16": try: returns.decode(encoding) exceptUnicodeDecodeError: continue returns.decode("latin-1")#willalwayswork UTF-16編碼的檔案不會解碼為UTF-8,因此我們首先嚐試使用UTF-8。

如果失敗,那麼我們嘗試使用UTF-16。

最後,我們使用Latin-1-這將始終有效,因為所有256個位元組在Latin-1中都是合法值。

在這種情況下,您可能想返回None,因為它實際上是一個後備,並且您的程式碼可能想要更仔細地處理(如果可以的話)。

如何一次從Python檔案中讀取單個字元? «上一篇 重試celery任務並以指數方式退回下一篇» 相關推薦 如何在Python中將帶點和逗號的字串轉換為浮點數 在Python中將帶BOM的UTF 在python中將帶有兩個引數的函式傳遞給filter() 在Python中將帶符號的符號重新解釋為無符號的符號 如何在Python中將帶分數的字串轉換為浮點數 在Python中將帶有偏移量的奇數時間戳轉換為UNIX時間 在Python中將帶小數位的字串列表轉換為整數 在Python中將帶有千位分隔符的字串轉換為整數 如何在Python中將帶有'X'的字串填充到最小長度? 如何在Python中將列表轉換為帶空格的字串? 搜尋 基礎教學 Mysql入門 Sql入門 Android入門 Docker入門 Go語言入門 Ruby程式入門 Python入門 Python進階 Django入門 Python爬蟲入門 新加入文章



請為這篇文章評分?