Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
30
Help us understand the problem. What is going on with this article?
@komorin0521

日本語文字をローマ字に変換するpykakasiモジュールのインストールと利用について

More than 1 year has passed since last update.

やりたいこと

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

やっぱり!

参考

30
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
komorin0521
1989年(平成)生まれの 好きな言語: Python フォローされてない方からのコメントも大歓迎です! なお、投稿した記事は個人としてのものであり、所属する団体とは関係ございません。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
30
Help us understand the problem. What is going on with this article?