やりたいこと
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
やっぱり!