『Shiroさん Gauche について語る - Higepon’s blog』の動画で、Gaucheの作者shiro氏(こんな人に師事したい)の「PerlからSchemeにほとんど書き(乗り)換えちゃった」的な発言に感化され、自分もPythonで色々やってみることにした。魔人ブウと村人A以上にレベル違うけど(||゚Д゚)
過去にPythonでリネーマーでも作ろうかと思案したが、MacOSX上のファイル名を取得すると『ほげほげ』が『ほけ"ほけ"』みたいに濁点が分割される問題が面倒でサジ投げたことがある。
こことかあそことかで調べてみたけど、正規化とかユニコードとかわけわからなかった(´・ω・`)。それでも何とかなるだろうと信じてファイルネームの修正を試みることにした。(ここが参考になった『http://www.kharakawa.com/kh.log/archives/2008/03/python.html』)
とりあえずファイル名を補正する関数をPythonで作ってみた
from unicodedata import normalize def normalize_str(form, str, encoding): s = normalize(form, str.decode(encoding)) return s.encode(encoding)
テストしてみる
下準備として任意のディレクトリ(hoge)にひらがなで『ほげほげ』ファイルorフォルダを作る。(例 "/Users/username/hoge/ほげほげ)
glob.globで任意のディレクトリにあるファイル名を取得して実行する。(パスのディレクトリ内すべて取得glob.glob(dirpath)、ファイルひとつだけ取得glob.glob(dirpath)[0])
関数normalize_str の form に"NFC"をいれると濁点分割->濁点合体に。
#test import glob dirpath = "/Users/username/hoge/*" filename = glob.glob(dirpath)[0] #get filename print filename #original filename nor_str = normalize_str("NFC", filename, "utf8") print nor_str
結果
/Users/username/hoge/ほけ"ほけ"
/Users/username/hoge/ほげほげ
そしてまた戻せる(濁点分割)
formに"NFD"をいれる。
print normalize_str("NFD", nor_str, "utf8")
結果
/Users/username/hoge/ほけ"ほけ"
そろそろ「オラPython使える」って言ってもいいっちゃね?
まだまだ初心者レベル(´・ω・`)?
おまけ
特に意味ないけど実験?に使ったコード
from unicodedata import normalize import glob dirpath = "/Users/username/hoge/*" for filename in glob.glob(dirpath): #original print filename #NFC nfc_filename_u = normalize('NFC', filename.decode('utf8')) nfc_f_encode = nfc_filename_u.encode('utf8') print nfc_f_encode #NFD nfd_filename_u = normalize('NFD', nfc_f_encode.decode('utf8')) nfd_f_encode = nfd_filename_u.encode('utf8') print nfd_f_encode # /Users/username/hoge/ほけ"ほけ" # /Users/username/hoge/ほげほげ # /Users/username/hoge/ほけ"ほけ"