やりたいこと
pykakasiを利用して、
日本語文字をローマ字に変換できるようにする
モチベーション
別のスクリプトでFlaskを用いてファイルアップロードするものを書いているんですが、
そのスクリプトでfrom werkzeug import secure_filename を下記のように使っています。
filename = secure_filename(filepath)
このとき、filepathがほげ.jpgなどの日本語の場合、日本語の文字が除去されてしまって、jpgになってしまった...
それでは困るので、解決案として日本語のファイル名があったときに、ローマ字に変換すればよいのではと思い調査したところ、pykakasiというモジュールでできそうだった。
早速pipでインストールして利用しようとすると、少しだけはまったので、備忘も兼ねて記載
pykakasiのインストールと利用
インストールについて
python + pyenv-virtualenvの環境
pip install pykakasiでは、変換用の辞書がどうやら見つからずエラーになった。
漢字をローマ字に変換できるPythonライブラリ "pykakasi" を使ってみた。の記事のコメントを参考にインストールしたら問題なく解決!
$ pip install git+https://github.com/miurahr/pykakasi
利用について
python2.7系統
python2系で利用していたので早速、利用
# coding: utf-8
from pykakasi import kakasi
kakasi = kakasi()
kakasi.setMode('H', 'a')
kakasi.setMode('K', 'a')
kakasi.setMode('J', 'a')
conv = kakasi.getConverter()
filename = '本日は晴天なり.jpg'
print(conv.do(filename)) # 本日は晴天なり.jpg
で、printした結果、本日は晴天なり.jpgとなった。あれ?
で、さらに調べてみると、pykakasiインストール後に変換できない mac raspberry pi にて、文字列がunicodeでないと変換できないとのこと!
というわけで、修正して試した。
# !/usr/bin/env python2
# coding: utf-8
from pykakasi import kakasi
kakasi = kakasi()
kakasi.setMode('H', 'a')
kakasi.setMode('K', 'a')
kakasi.setMode('J', 'a')
conv = kakasi.getConverter()
filename = '本日は晴天なり.jpg'
print(type(filename))
print(conv.do(filename))
print(type(filename.decode('utf-8')))
print(conv.do(filename.decode('utf-8')))
出力結果
<type 'str'>
本日は晴天なり.jpg
<type 'unicode'>
honjitsuhaseitennari.jpg
おお、できた!python2では、文字はstr型とunicode型があって、特になにもしないとstr型になってしまうので、decodeしないといけなかった。
ということは、__future__モジュールのunicode_literalsを用いればdecodeしなくてもよいんじゃ?ということで試してみた。
# !/usr/bin/env python2
# coding: utf-8
from __future__ import division, unicode_literals
from pykakasi import kakasi
kakasi = kakasi()
kakasi.setMode('H', 'a')
kakasi.setMode('K', 'a')
kakasi.setMode('J', 'a')
conv = kakasi.getConverter()
filename = '本日は晴天なり.jpg'
print(type(filename))
print(conv.do(filename)
出力結果
<type 'unicode'>
honjitsuhaseitennari.jpg
やっぱり。2系統書くときはちゃんと__future__モジュール使うべきですね。
python3系統
python3では、日本語文字は全てunicodeで扱われるので、特にdecodeせずともいけるじゃないかという推測の元試してみた。
# !/usr/bin/env python3
# coding: utf-8
from pykakasi import kakasi
kakasi = kakasi()
kakasi.setMode('H', 'a')
kakasi.setMode('K', 'a')
kakasi.setMode('J', 'a')
conv = kakasi.getConverter()
filename = '本日は晴天なり.jpg'
print(type(filename))
print(conv.do(filename))
出力結果
<class 'str'>
honjitsuhaseitennari.jpg
やっぱり!