にわかSteamerのメモ帳

PCゲームや人工知能関連の話題についての日記

Pythonで濁音が分離された文字列を結合する方法

ある処理を行っていた時,文字列の判定で少し苦労しました. あるデータ"グルメ.xlsx"というファイルを読み込んで,ファイル名で処理を変えようと思い,とりあえず以下のように書きました.

for fname in glob.glob(./data/*.xlsx):
    if 'グルメ' in fname:
        print(fname)

しかし,何故か何も出力されずに処理が終わってしまうのです."グルメ.xlsx"ファイル自体は存在し,fnameを出力させても”グルメ”の文字列は存在しています. なぜかinで判定出来ないのです.そこで,unicodeの値を見てみると

print(fname.encode('unicode-escape'))
print('グルメ.xlsx'.encode('unicode-escape'))
b'\\u30af\\u3099\\u30eb\\u30e1.xlsx'
b'\\u30b0\\u30eb\\u30e1.xlsx'

下と比べて上はなんか一文字分入ってる...この文字(\u3099)をネットで検索してみると...

https://glyphwiki.org/wiki/u3099

濁点やんけ!!!!!!!

ようやく原因がわかりました.何故か濁音の文字が分離されていたのです!!!(何故?globのせい?)

とりあえず原因がわかったので,以下のように対応しました.標準ライブラリのunicodedata.normalize関数は複数存在する文字の表現を1つの表現に整形してくれる関数です.便利便利

import unicodedata

# 濁点の分離を整形
fname = unicodedata.normalize('NFKC', fname)

print(fname.encode('unicode-escape'))
print('グルメ.xlsl'.encode('unicode-escape'))

出力はきれいに同じ形になっていますね

b'\\u30b0\\u30eb\\u30e1.xlsl'
b'\\u30b0\\u30eb\\u30e1.xlsl'