Python2でutf8のbomを削除する

utf8のテキストファイルには読み込んでBOM(Byte Order Mark)が付いている場合がある。

バイトオーダーマーク - Wikipedia

emacsでBOM付きのutf8のファイルを作成するには、M-x set-buffer-file-encoding-systemで「utf-8-with-signature」を選択する。

出来上がったファイルをhexdumpしてみると先頭がef bb bfであることがわかる


単純にstartswithでバイト列の先頭を比較して除去することができる

UTF8_BOM = bytearray([0xEF, 0XBB, 0XBF])


def strip_bom(s):
    if s.startswith(UTF8_BOM):
        return s[len(UTF8_BOM):]
    return s

f = open("utf8.txt", "r")
s = strip_bom(f.read())
print s.encode('string_escape')
# => \xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a\n


一度utf_8_sigでdecodeしてencodeしなおして結果は同じ

f = open("utf8.txt", "r")
s = f.read().decode('utf_8_sig').encode('utf-8')
print s.encode('string_escape')
# => \xe3\x81\x82\xe3\x81\x84\xe3\x81\x86\xe3\x81\x88\xe3\x81\x8a\n