読者です 読者をやめる 読者になる 読者になる

牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

PythonでMacOSX上のファイル名を取得するとカナとかの濁点が分割される問題をまた考えてたら簡単な関数できた

Python MacOSX

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/ほけ"ほけ"