Date: 2008-05-20
Tags: python

文字コード判定して一括でuft-8に変換するPythonスクリプト

utf-8でのHTML作成を依頼したらEUC-JPで送られてきたので自分で変換してしまう。findとnkfを組み合わせれば良いんだろうけど、とりあえず手元にWindowsしか無かったんでPythonで作ってしまった。

カレントディレクトリ以下のテキストと思われるファイルを全てutf-8に変換する。文字コード判定というかトライ&エラー方式。 バイナリファイルは変換に失敗したらskipするという手法。画像ファイルなんかはまあ大丈夫だろうけど、誤変換しない保証はない。・・・怖。

import os, sys

def guess_charset(data):
    f = lambda d, enc: d.decode(enc) and enc

    try: return f(data, 'utf-8')
    except: pass
    try: return f(data, 'shift-jis')
    except: pass
    try: return f(data, 'euc-jp')
    except: pass
    try: return f(data, 'iso2022-jp')
    except: pass
    return None

def conv(data):
    charset = guess_charset(data)
    u = data.decode(charset)
    return u.encode('utf-8')

for dirpath, dirs, files in os.walk(os.getcwd()):
    for fn in files:
        path = os.path.join(dirpath, fn)
        fobj = file(path, 'rU')
        data = fobj.read()
        fobj.close()
        try:
            data = conv(data)
        except:
            print path, "-> skip"
            continue
        fobj = file(path, 'wU')
        fobj.write(data)
        fobj.close()
        print path, "-> converted"