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'