在Python中將帶BOM的UTF - 程式人生
文章推薦指數: 80 %
我想將它們(理想情況下)轉換為沒有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爬蟲入門
新加入文章
延伸文章資訊
- 1BOM 的去除方式:分別使用vim, Python, 及bash - Kirin
BOM 的去除方式:分別使用vim, Python, 及bash. 0. Kirin written 10 個月ago. 最後更新日期:2022 年01 月3 日. BOM 是Byte Orde...
- 2Python: 關於Unicode 的BOM - 傑克! 真是太神奇了! - 痞客邦
註一: 主要是因為可使用的編碼數只有256 個, 而不同code page 之間會對應不同的符號, 進而無法得知資訊的原始樣貌. 關於Unicode 的BOM (Byte Order Mark)...
- 3[python] 解決生成csv file編碼問題(with BOM) - JysBlog
當我們使用UTF-8生成csv時,並未在header生成BOM訊息,所以Excel會依照Unicode編碼讀取,就會有亂碼產生。 實作. 下面是簡單的生成csv的python程式:.
- 4python 讀取帶BOM的utf-8格式檔案 - 程式人生
微軟在UTF-8中使用BOM(Byte order mark)是因為這樣可以將UTF-8和ASCII等 ... 比如很多現代指令碼語言,例如python,其直譯器本身是能處理BOM的, ...
- 5Python 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...