2012年10月26日

UUNZIP-0.0.6a Installing Package Has Released for Linux Users!

English text was wroted below in this article.(英語の文書はこの記事の下方に書きました。)
 さて、昨日installer.pyのソースコードを公開してから、ちょちょいのちょいでパッケージを作れば終わりだと、思ってたが、そうではなかった。最低限のパッケージで良しとすれば、確かにuunzip.pyとinstaller.pyのみをセットにして配布すれば済むだろうが、やっぱ、使ってもらうには最低限、「1.インストール方法」と「2. 最低限の使い方」を記したREADME.TXT程度は添付する必要がある。確かに、uunzip.pyとinstaller.pyのソースコードの中には、そりなりの記述があるので読んでねというのも一興だろうが、それをプログラムに興味のない一般ユーザに求めても仕方がないだろう。

 ということで新ためてREADME.TXTを作成した次第だ。でも、ここで詰ったのがやはり外国人ユーザへの対応で英語という壁だ。プログラムを書く以上、確かに他の人が書いたプログラム資産を活用する為に英語のREADME.TXTは結構読んでいる訳だが、それを書こうとすると、日本語の様には言葉が出て来ないし、所詮、broken englishとなってしまう。broken englishでも仕方ないので書いたのだが、余り複雑な言い回しは、英語では思いつきもしないし無理に英語にしても英語にならないので省かざるを得ない。悲しい限りである。
 その結果ほぼ英語らしき単文を並べ、説明不足と思う部分は、具体的サンプルを掲載添付することで補うことになった。

 まあ、実際のREADME.TXTがどれだけNativeな人々に通用するかは判らないが、当方クラスの英語読解力の人間なら、熱意で英語でなく英語の行間や実際のプログラムを操作して理解出来るのでここらで勝手に良しとしようと思う。

 そんな所で手を打ったと言うか打ちきったREADME.TXTの和訳と言うか、英語で書いたつもりの日本語が以下のテキストである。英語のそれもそうだが、当然充分とは言えないので、もし、この辺りに手を入れて頂ける方がいたらとても有難い。

             uunzip-0.0.6a/readme-ja(utf-8).txt


############################################
uunzip(旧称:unzip-cp932) 0.0.6a 2012-10-23
############################################

 これは、Mire(まぁいいやぁ) がメンテしています。 Bug連絡には、次のBlogのURLを
ご利用下さい。
http://pythonlife.seesaa.net/article/298750061.html

 このuunzip(旧称:unzip-cp932)とそのソースコードは「GPL」ライセンスの条項に
基づくことで活用頂けます。(GPL Licence詳細: http://www.gnu.org/licenses/gpl.html )

=========================
A. uunzipのインストール
=========================

0.  既にお済ませのことでしょうが、ダウンロードした「uunzip-0.0.6a.tgz」を解凍後
そのディレクトリに移ります。

$ tar xvzf uunzip-x.x.x.tgz
uunzip-0.0.6a/
uunzip-0.0.6a/readme.txt : このファイルの英語版
uunzip-0.0.6a/uunzip.py : uunzipのPythonソースコード
uunzip-0.0.6a/readme-ja(utf-8).txt : このファイル
uunzip-0.0.6a/installer.py : インストーラ (A-2)
uunzip-0.0.6a/uunzip-example_other_ja : サンプルスクリプト (B-9)
$ cd uunzip-x.x.x


1.  Linuxのコンソール端末で「whereis python」を実行して下さい。uunzipを実行させ
たいpythonを選んで下さい。

実行例::

$ whereis python
python: /usr/bin/python2.6-config /usr/bin/python2.6 /usr/bin/python /usr/lib/python2.6 /usr/lib64/python2.6 /usr/include/python2.6 /usr/share/man/man1/python.1.gz
$


2.  その選択したpythonで「installer.py uunzip.py'」を実行して下さい。この
installer.py は 'uunzip' を '/usr/local/bin'下にインストールします。

実行例::

$ su -
Password:<type root password>
# /usr/bin/python2.6 installer.py uunzip.py

or

$ sudo /usr/bin/python2.6 installer.py uunzip.py
[sudo] password for <your-id>: <type your password>
This installer runs with '/usr/bin/python2.6'
set 'uunzip.py' to /usr/bin/python2.6
'/usr/local/bin/uunzip' was wroted.

Check result. See below.
# ls -l /usr/local/bin/uunzip
-r-xr-xr-x. 1 root root 68312 10月 25 15:51 2012 /usr/local/bin/uunzip

with executing permission
# printenv | grep PATH
PATH=/sbin:/bin:/usr/sbin:/usr/bin

/usr/local/bin already exists in PATH.
# whereis uunzip
uunzip: /usr/local/bin/uunzip

'uunzip' command exists.
$


==================
B. uunzip を使う
==================

1. ZIPファイル内の書庫情報をリスト表示するには
===============================================

uunzip <1.a zip file>


2. ZIPファイルの書庫内の全ファイルを解凍するには
=================================================

uunzip <1. zipファイル> <2. 解凍先ディレクトリ>


3. ZIPファイルの書庫内の特定ファイルを解凍するには
====================================================

uunzip <1. a zipファイル> <2. 解凍先ディレクトリ> <3. ファイル1> <3. ファイル2> ...


4. ヘルプを見るには
====================

uunzip --help


5. 他言語で作成されたZIPファイル用に「encoding」と「encodings」を変更するには
==============================================================================

uunzip <1> <2> <3> ... encoding='gb18030' "encodings=['cp950','big5hkscs','Big5','utf-8']


6. uunzipの公開変数の値をチェックするには
==========================================

uunzip <1> <2> <3> ... <variable1>=<value1> ... help=True


7. uunzipの表示を他言語にするには
==================================

uunzip <1> <2> <3> ... "answers=['y','n','A','N','r']" msg_replace='\rreplace \"%s\"? [y]es, [n]o, [A]ll, [N]one, [r]ename: ' msg_zippath='\rArchive: ' msg_new_name='\rnew name[%s]: ' msg_mkdir='\rcreating: \"%s\"' msg_exit='\r%s was stoped.' msg_skip='\r\"%s\" was skipped over.' msg_unzip='\rinflating: \"%s\"' msg_exists='uunzip: cannot find or open' msg_readerr='Cannot read this file as zip.' "zinfo_items=[u'Length ',u'Date',u'Time',u'Name']" "zinfo_widths=[9,10,5,4]" zinfo_files='files' param='param'

日本語化の例::

uunzip <1> <2> <3> ... "answers=['y','n','A','N','r']" msg_replace='\r既存ファイル:\"%s\"\nこれを上書きしても宜しいのですか?\nやる[y], 抜かす[n], 有る分全部上書き[A], 何もせず終了[N], 別名なら保管[r]: ' msg_zippath='\r書庫ファイル: ' msg_new_name='\r新たな名前[%s]: ' msg_mkdir='\r作成中: \"%s\"' msg_exit='\r%s は以降の処理を中止しました。' msg_skip='\r\"%s\" を飛ばしました。' msg_unzip='\r解凍中: \"%s\"' msg_exists='uunzip: 探せないか開けません' msg_readerr='ZIPとして読めません。\nこれがZIPファイルなら再取得をお勧めします。' "zinfo_items=[u'サイズ ',u'年-月-日',u'時:分',u'ファイル名']" "zinfo_widths=[9,10,5,4]" zinfo_files='件' param='引数'


8. uunzipの表示を日本語にするには
==================================

uunzip <1> <2> <3> ... jang='ja'


9. 既定の変数セットの変更をするには
====================================

 下記の様なシェルスクリプトを作り「chmod +x <シェルスクリプトのファイル名>」を実行します。
「./uunzip-example_other_ja」を実行しご覧下さい。これはジョークサンプルですが。

#!/bin/sh
#-*- coding: utf-8 -*-
## this script is a joke example for transfering to other Japanese. ##
uunzip "answers=['y','n','A','N','r']" msg_replace='\r既存ファイル:\"%s\"\n上書きでええん?\n殺って[y], 抜いとき[n], みな殺ったれ[A], そん何止めてぇ[N], 名前変えまひょ[r]: ' msg_zippath='\r書庫ファイル: ' msg_new_name='\r新ファイル名[%s]: ' msg_mkdir='\r作成中: \"%s\"' msg_exit='\r%sでした。また今度ぉ' msg_skip='\r\"%s\" は止しといたで' msg_unzip='\r開梱中: \"%s\"' msg_exists='uunzip: 見えまへん' msg_readerr='ZIPにゃ見えまへんな\nもっ遍貰うて来て' "zinfo_items=[u'デカさ ',u'年-月-日',u'時:分',u'ファイル名']" "zinfo_widths=[9,10,5,4]" zinfo_files='個' param='引数' $*


10. ヘルプ文書の変更をするには
===============================

 既定パスが、'/usr/local/etc/uunzip/man/uunzip.hlp' のテキストファイルを新たに
作成しこのファイルをコピペした後、お望みなら、翻訳または修正して下さい。


11. 'ja'の様な、ご自分の言語用の「lang」値を作るには
=====================================================

 お作りの変数セットまたはシェルスクリプトを Mire in JapanのBlogのURLにお送り
願います。 http://pythonlife.seesaa.net/article/298750061.html

 これをお読みになれたなら、このURL(uunzip-0.0.6a.tgz)からダウンロードしてuunzipをご利用下さい。
尚、ドキュメント整備とバグとりへのご協力を必要としています。良かったら宜しくお願い
します。

 読み返すと、手を入れたくなるのだが、一般ユーザが使う範囲で言えば問題ないかなと思っている。その英語と思って、これより先に書いたものが次のREADME.TXTだ。続きを読む
posted by Mire at 22:00 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年10月25日

Python ScriptをLinuxコマンドとしてinstallする「installer.py」

 前稿でのuunzip公開でようやく、文字化けから開放されたZIP解凍を提供出来たはずではあるが、このままでは、やはり、ある程度プログラミングに馴染みがあるか興味のある方しか利用しようとしないだろう。折角、作ったからには、それなりに、その便益を広く共有したいと言うのが人情だ。その為には、helpにある通り、「python uunzip.py」ではなく「uunzip」のみで利用出来る様にするinstallerを付けたパッケージの作成が、不可欠である。
 本稿は、その実現の為に今回作成したinstallerを公開することにする。仕様としては次の様になっている。
  1.  「拡張子を省いて実行出来る様にinstallしたいPythonスクリプト」自体を走らせたいPythonへのフルパスで、この「instaler.py」を実行することで、拡張子を省いて実行出来る様にinstallしたいPythonスクリプトの実行Pythonを決定する。
  2.  第1引数には、拡張子を省いて実行出来る様にinstallしたいPythonスクリプトのコードを指定する。この「instaler.py」は、そのソースコードを読込み、第1行目にある実行Pythonへのパスを、1の指定通りに書替えたものを「/usr/local/bin」(既定)以下に拡張子の「.py」を外したファイルで書込み、必要となる実行権付与等を行なう様にしている。
  3.  必要なら、第2引数に指定することで、既定のinstall先「/usr/local/bin」を別のものに変更することも出来る。但し、そのinstall先は、環境変数PATHに予め登録されていることが必要である。もし、環境変数PATHにないパスを指定したいなら、その登録は、手作業で行なって頂くことが前提なので、既定の「/usr/local/bin」でないなら、個人のみに有効な「~/bin」辺りを推奨する。でも、ここに実際には無いディレクトリを指定すると、その旨表示して終了する。これも、事前に別途、手動で作成することが必要と言うことだ。
  4.  install処理が終わったら、その実体を検査表示する様にした。
  5.  使い方は、「instaler.py」に引数を何も付けずに実行することで表示する。
  6.  当然ながら、「/usr/local/bin」等ユーザのホーム領域以外をinstall先とするには管理者権限で実行することが必須となるので、予め、rootパスワードを使って「su -」で、管理者になって行なうか、ユーザへの設定を予めした上で「sudo」とユーザパスワードで、行なうことになる。

 「uunzip」での具体的な実行例は次の通りである。実行させるPythonの指定は、必ずしも、この様にバージョン番号付である必要はないが、明示しておくことを推奨する。例えば、CentOS6の素の環境では/usr/bin配下に2つ程、Pythonの実行ファイルがあるが、これらはいずれも同じものであるが、これがOSのupdateで勝手にグレードアップまたはダウンされたとしたら、動作しなくなる可能性は完全否定することは出来ないからである。無論、当方の公開しているPythonプログラムであれば、アクロバティックなものはないので、Python2.6が、2.5に落ちようととも、2.7に上がろうとも、外部モジュールに問題がなければ動作する訳で、その傾向はPython2.xの互換性重視の姿勢によるものだ。例えそうであっても、手持ちのものがどの環境で動作することを前提に存在したかを明示する価値はあるものと思うからである。




[mire@localhost ~]$ ls -la /usr/bin/python* | grep -v config
-rwxr-xr-x. 2 root root 9032 6月 18 22:19 2012 /usr/bin/python
lrwxrwxrwx. 1 root root 6 6月 19 02:12 2012 /usr/bin/python2 -> python
-rwxr-xr-x. 2 root root 9032 6月 18 22:19 2012 /usr/bin/python2.6
[mire@localhost ~]$
[mire@localhost ~]$ sudo /usr/bin/python2.6 installer.py uunzip.py
[sudo] password for mire:
This installer runs with '/usr/bin/python2.6'
set 'uunzip.py' to /usr/bin/python2.6
'/usr/local/bin/uunzip' was wroted.

Check result. See below.
# ls -l /usr/local/bin/uunzip
-r-xr-xr-x. 1 root root 68312 10月 25 01:39 2012 /usr/local/bin/uunzip

with executing permission
# printenv | grep PATH
PATH=/sbin:/bin:/usr/sbin:/usr/bin

/usr/local/bin already exists in PATH.
# whereis uunzip
uunzip: /usr/local/bin/uunzip

'uunzip' command exists.
[mire@localhost ~]$


 以下が、「installer.py」のソースコードである。今回、当方では「uunzip」の配布用に活用するが、同様の用途であれば、そのままでも充分に活用出来るだろう。ライセンスは、例により、GPLなので、ソースコードも含めて有効に活用頂ければ有難い。

続きを読む
タグ:Python Installer
posted by Mire at 03:01 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年10月24日

【Linux】文字化けで解凍不能なZIPファイル用「uunzip」第6版リリース

 前稿でunzip-cp932の第4版をリリースして以来、末尾に記載したucode()関数を活用したバカチョンのunzipコマンドの作成に勤しんで来た。これ自体の動作確認は早々に録れていたのだが、ついでに、利用言語別の翻訳対応やらドキュメント整備やら、仕様拡張の度に修正している内に結構時間を費やしてしまった。でも、ドキュメント整備をしながら動作チェックを進めた結果、良くやってしまう、とんでもない凡ミスを公開することだけは避けることが出来た様には思う。

 ということで予告通り、今版より改名し、uunzipとさせて頂いた。命名の気持ちはUniversal UNZIPなのだが、実際は、Uno UNZIP、つまり、一つのUNZIPツールって所であることも確かなことなので取り敢えず中をとって「Uni UNZIP」の略ということにさせて頂くことにした。命名の最初の発想は、キー入力で楽したかっただけってことは内緒だ(笑)。

 仕様的には機能提供重視で曲がりなりにその目的達成させた為、未だ発展途上なものの、少なくとも日本国内の日本語中心のユーザなら、ZIPファイルをバカチョンで文字化け無く解凍頂けるものになったと思うし、その気になってくれた外国人ユーザーにも活用出来る程度の機能とドキュメント整備は出来たかな? と思う。まぁ、当方の英語力で書いたbroken engllishでは伝わらないことも多いだろうが、自分も判らない英語ドキュメントは実際に使って試てから理解している口なので、その気になってくれたら何とかなるものと思っている。
 後、足りていないものはinstallerの公開だが、それは、次稿で行ない、本稿のuunzipと合わせた配布パッケージを作成し、掲載しようと思っている。乞うご期待と言ったところだ。

 尚、使い方等は、ソース中のヘルプに入っているので改めて、本文に記載することは遠慮させてもらう。エスケープシーケンスの制御文字を含む為、多少見難いとは思うが、ご勘弁頂きたい。

            ~/uunzip.py (前半)


#!/usr/bin/python2.6
#-*- coding: utf-8 -*-
u"""
uunzip: UUNZIP(Uni UNZIP) unzips an zip arcive file that created with OS for any
language encoding. Default setup is for Japanese Language encodings. If
not worked well, Set encoding, encoding0 and enocdings option for your
language's encodings.

USAGE: uunzip <zip file> <path for extract files into> <target file1> <target file2> ...

※  Windows日本語版で作成したZIPファイルはアーカイブ情報の文字コードがcp932で
ある為、Linux上のツールによっては文字化けの為、解凍自体が出来ないことすらある。
 このソースコードはcp932をuncode化し問題解消図ったunzip-cp932を起源とするが、
今回、文字化け対策としてPython標準の全encodingを試す仕様にしたことから少なく
とも日本語利用中心の利用者間のZIPファイル交換なら、既定値のままで意識すること
なく双方向に解凍することが出来る筈だ。中文、ハングルと言った東アジア系
の言語圏のユーザであれば、変数encoding等をコマンドラインオプションで指定替え
することで同様に対応可能かと思う。但し、西欧言語には一切の配慮やテストもして
いないので、その成否は判らない。レポート頂けると有難いところだ。
 見た目はLinux標準のunzipに近い操作性をエミュレートしているが、unzip形式の
豊富なコマンドオプションは実装していない。引数位置は基本的に固定で、全てを
省略するか「--help」をつけると簡易ヘルプを、第1引数のZIPファイルのみを指定した
場合には、「unzip -l」相等の書庫情報リスト表示を解凍先ディレクトリ指定席の
第2引数を追加することで初めて主目的の解凍処理が機能する。さらに第3引数以降には
ZIP書庫内の解凍対象ファイルを必要なだけ個別で列記指定出来る。
 以上、機能的には少ないながらも「ヘルプ表示」「書庫一覧」「一括解凍」そして
「指定ファイルの書庫解凍」の4機能を提供出来ている。
 しかし、これだけでは日本語以外のユーザ環境では適切に対応出来ない可能性がある
のも事実なので、予め有用な既定値を与えている変数については「=」を挿み値を変更
出来る様にした。

【専用関数】
prn_help() : 簡易ヘルプ表示の関数
def unzip() : 個別ファイルの解凍先への解凍処理の本体
prn_ZipInfo() : 書庫情報の非表示
ZipInfo_sum(z) : 書庫情報の総ファイル長とファイル数のタプルを返す
exist_filename() : 拡張子補完を含め指定ファイル名の存否確認後存在名を返す
and_items() : 2つのリスト共通の文字列を返す関数(各要素は文字列に限る)
new_name() : 3桁の数値iを附記した非重複ファイル名候補を提示し入力
u_unzip() : 「uunzip(旧称:unzip-cp932)」の本体関数
main() : コマンド引数を処理しu-unzip()関数の引数を確定する関数
【汎用系関数】
select() : コンソールプロンプトを出し求める範囲の返答の英字1文字を返す
unicode_width() : UNICODE文字列の文字幅を返す関数(2010-05-10公開分)
unicode_ljust() : UNICODE左寄せ
unicode_center() : UNICODE中央寄せ
unicode_rjust() : UNICODE右寄せ
replaces() : 特殊文字をpython表記に置替える関数
"""
__author__ = "Mire in Japan"
__date__ = "2012-10-23"
__version__ = '0.0.6a'
__copyright__ = 'Copyright (c) 2012-09-28 Mire'
__license__ = 'GPL'
__url__ = 'http://pythonlife.seesaa.net/article/298750061.html '

__history__ = U"""【更新履歴】
0.0.1 2012-09-28  リリース初版
0.0.1a 2012-09-30  解凍処理中のみ個別ファイル名を画面表示する様に変更
0.0.2 2012-10-01  書出先に同名ファイルがある場合の処理選択を追加
オリジナルのunzipと異なりファイル名変更時に非重複名を
生成し提示する仕様に
 仕様変更部分の説明書きを修正
 ファイル名は引用符で囲んで表示する様に
0.0.3 2012-10-02  第3引数以降に解凍ファイル(複数)を指定出来る様に仕様変更
 さらに、第1引数だけのときは書庫情報の一覧を表示する様に
することで、解凍時には第2引数の解凍先の指定が必須となった。
0.0.4 2012-10-05  unzip-cp932の本体をunzip4cp932()関数に記述し、最下部の
実行部分はその引数定義に留めた。またunzip4cp932()関数はフロー
中心の記述に留め、具体的な処理は個別関数に記述した。
 また、オリジナルのunzipと異なり一覧表示時の項目幅も引数で
カスタマイズ可能にした。日本語化も変数のリテラル値を変更する
だけだ。
0.0.5 2012-10-06  ユニバーサルなunicode変換関数ucode()を適用、cp932に限らず
ZIP書庫情報の文字化けに対応した(つもり)。但し、既定では、現在
ucode()のencoding候補のencodingsには日本語関係のみ搭載。
[ 恒久的な別解としては、Python標準モジュールのzipfile.pyへの
patch作成もある。ここで充分テストした上で考えることにする。]
 zipとして読めないときのメッセージ表示を追加。
 このリリースより、名称をunzip-cp932からuunzipに変更。
0.0.6 2012-10-18  独自様式ながら、main()関数内定義の一部変数について、コマンド
オプションで、指定可能にした。u_unzip()関数にはuuzipの全機能を
main()関数は既定値の設定に加え、u_unzip()関数内のコマンド引数
の処理を移行、「味噌も○ ○ も」的色彩を薄めた。これにより、
encodingとencodingsを指定替えすることで多言語利用での「下手な
鉄砲も数打ちゃ中る」的精度と効率を上げることが取り敢えず可能に
なった。
0.0.6a 2012-10-23  ucode()関数のencoding名をPython内定義名称に統一し重複除去
Clean up source. edited documents of this help and functions.
enabled help customize with making help file. wrote on help
command options example.for other language users.
"""
__todo__ = u"""【TODO】: 対応する気はないけど(笑)備忘の為、課題を列記
*  オリジナルのunzipとは異なり、zip解凍の機能のみをpythonで実現したものだ。
従って、不具合解決や思いついた仕様を何時でも盛り込める。
*  ただ、unzip同等にコマンドとして実行するには、その為、Linux環境別に第1行目の
pythonへのpathを調整する必要がある。これは別途listallerで近日対応予定だ。
*  オリジナルのunzipとは異なり、unzipにある豊富なオプションには完全未対応。
これについては、強制上書等コマンド処理で有効なものはいずれ実現させる予定だ。
*  オリジナルのunzipとは異なり、第1引数のzipファイルのみを指定した場合は、
その書庫内のファイル一覧を表示する仕様としている。その為、解凍には第2引数の
「解凍先ディレクトリ」の指定が最低限必須となる仕様とした。
*  オリジナルのunzipとは異なり、第2引数は「解凍先ディレクトリ」の固定であり、
解凍対象ファイル名ではない。第3引数以降が解凍対象ファイルの指定席である。
*  現公開スタイルはBlogでのこのソースコードの表示公開のみだ。いくらLinux用と
言っても一般ユーザにはinstaller添付の配布パッケージが必要だろう。installerは
別途汎用で作成した上で、配布パッケージファイルを作成し近日DL可能にしたい。
"""

### 【専用関数】 ###
def read_help(file='uunzip.hlp'):
u"""
replace help_text function
"""
from os.path import exists
if exists(file):
fpi = open(file, 'r')
lines = fpi.readlines()
fpi.close()
help_txt = u''.join(lines)
return help_txt
else:
return None

def prn_help(pub_vanames=[], variables={}, help_txt=None):
u"""display help func.
簡易ヘルプ表示の関数
"""
if help_txt==None:
help_txt = u"""uunzip(unzip-cp932) %s of %s. Maintained by %s. Send bug
reports using %s
You can use uunzip(unzip-cp932 old name) and this source code under the terms of
the \'%s\' Licence.(See for detail: http://www.gnu.org/licenses/gpl.html )

USAGE: uunzip[ --help][ <a zip file>[ <path for extract files into>[ <file1> ...][ <valiable>=<value> ...]]]

1. Displays this.help.and values of public variables.
unnzip
or
unnzip --help

2. Displays files infomation list in zip file's archive.
uunzip <1.zipfile>

3. Extracts all archive files into specified path.
uunzip <1.zipfile> <2.path for extract files into>

4. Extracts specified file(s) into specified path.
uunzip <1.zipfile> <2. path for extract files into> <3.file1> <3.file2> ...

5. Specifies zip file's encoding.
uunzip <1> <2> <3> ... encoding='<zip file's encoding>'

6. Specifies zip files's encodings for your languages
uunzip <1> <2> <3> ... "encodings=['<encoding1>','<encoding2>'...]"

7. Transrates uunzip display. Please, transrate to your language.
uunzip <1> <2> <3> ... "answers=['y','n','A','N','r']"\\
msg_replace='\\rreplace \\"%%s\\"? [y]es, [n]o, [A]ll, [N]one, [r]ename: '\\
msg_zippath='\\rArchive: '\\
msg_new_name='\\rnew name[%%s]: '\\
msg_mkdir='\\rcreating: \\"%%s\\"'\\
msg_exit='\\r%%s was stoped.'\\
msg_skip='\\r\\"%%s\\" was skipped over.'\\
msg_unzip='\\rinflating: \\"%%s\\"'\\
msg_exists='uunzip: cannot find or open'\\
msg_readerr='Cannot read this file as zip.'\\
"zinfo_items=[u'Length ',u'Date',u'Time',u'Name']"\\
"zinfo_widths=[9,10,5,4]"\\
zinfo_files='files'\\
param='param'

8. Checks the value of variables spcified for customizing uunzip.
uunzip <1> <2> <3> ... <variable1>=<value> help=True

UUNZIP(Uni UNZIP) unzips an zip arcive file that created with OS for any
language encoding. Default setup is for Japanese Language encodings. If not
worked well, Set encoding, encoding0 and enocdings option for your language's
encodings. Command line option helps you to custamize for your zip archive files
created with Other Operation System.

Command line options of UUNZIP


See below for detail in Japanese.

詳細は下記参照(日本語のみ)

利用方法: uunzip[ --help][ <zipファイル>[ <解凍先ディレクトリ>[ <解凍対象ファイル1> ...][ <変数名>=<値> ...]]]

※ 書庫情報の表示には「ZIPファイル」1つを指定する。さらにZIP書庫内ファイルの
全解凍には「解凍先ディレクトリ」を続けて引数指定する。ZIP書庫内の特定ファイル
のみを解凍したい場合には、その後にそれらのファイル名を続けて引数指定する。
動作上の見栄えはunzipを模倣していているがコマンド式の多様なオプションは一切
実装していない。しかし以下の独自仕様で「文字コードの指定」「表示の日本語化」
を実現している。従って、よく使うオプションについては、Windowsであればbatch、
Linux系であれば、shellスクリプトに、その実行通り記述し、それを実行すれことで
容易にカスタマイズ出来る。uunzipは相応の蓋然性で多言語環境でも上手く文字化けを
回避するとは思うが、それが出来ない場合にはencoding、encoding0そしてencodingsに
以下の例示を参考に試して頂くと解決出来る可能性が高いものと思う。

unzip準拠表記を日本語に : lang (例、lang='ja')
ZIPファイルの文字コード : encoding (例、encoding='latin_1' )
手元PC OSの文字コード : encoding0 (例、encoding0='euc-kr' )
頻出文字コードの優先リスト: encodings (例、encodings=['gb18030','Big5'])
例(exapmles):
简体中文: "encodings=['cp950','big5hkscs','Big5','utf-8']"
繁體中文: "encodings=['gb18030','gbk','GB2312','Big5','hz','utf-8']"
한 국 어: "encodings=['cp949','utf-8','euc-kr','iso2022_kr','johab']"
西  欧: "encodings=['cp1250','mac_roman','cp1252','cp850','iso8859_15'
,'latin_1','utf-8','cp1140','cp500']"
※ 用途に合わせ要編集(Edit for your needs)
全encodingを試すか否か : test_all (例、test_all=True test_all=False)

 また、日本語化同様、他言語表示化も、以下の変数に対するコマンド引数を翻訳し、
適宜レイアウトを調整すれば概ね納得の行くだろう。
 以下に、オリジナルのunzip英語表記のコマンドオプション引数と日本語表記の例を
示しておくので、テキストエディタ上にコピペの上お好きな言語に翻訳した後に、
uunzup の後にコマンドオプションとして付けて実行して試てエラーにならず、正しく
「【変更可能な変数と現在値】」として表示されたら成功だ。必要によりencoding、
encodings及びencoding0辺りを上記のものを参考に適切に補完すれば、手持ちの殆どの
ZIPファイルが処理可能になるものと思う。文字列は全てunicode文字列であることが
必須で、スペース文字や引用符を含む場合に正しくOSに認識させるには含む引用符とは
異なる引用符で引数全体を囲む必要があることを忘れないで頂きたい。

"answers=['y','n','A','N','r']"\\
msg_replace='\\rreplace \\"%%s\\"? [y]es, [n]o, [A]ll, [N]one, [r]ename: '\\
msg_zippath='\\rArchive: '\\
msg_new_name='\\rnew name[%%s]: '\\
msg_mkdir='\\rcreating: \\"%%s\\"'\\
msg_exit='\\r%%s was stoped.'\\
msg_skip='\\r\\"%%s\\" was skipped over.'\\
msg_unzip='\\rinflating: \\"%%s\\"'\\
msg_exists='uunzip: cannot find or open'\\
msg_readerr='Cannot read this file as zip.'\\
"zinfo_items=[u'Length ',u'Date',u'Time',u'Name']"\\
"zinfo_widths=[9,10,5,4]"\\
zinfo_files='files'\\
param='param'

「lang='ja'」相当の翻訳でのコマンドオプション引数の例:

"answers=['y','n','A','N','r']"\\
msg_replace='\\r既存ファイル:\\"%%s\\"\\nこれを上書きしても宜しいのですか?\\nやる[y], 抜かす[n], 有る分全部上書き[A], 何もせず終了[N], 別名なら保管[r]: '\\
msg_zippath='\\r書庫ファイル: '\\
msg_new_name='\\r新たな名前[%%s]: '\\
msg_mkdir='\\r作成中: \\"%%s\\"'\\
msg_exit='\\r%%s は以降の処理を中止しました。'\\
msg_skip='\\r\\"%%s\\" を飛ばしました。'\\
msg_unzip='\\r解凍中: \\"%%s\\"'\\
msg_exists='uunzip: 探せないか開けません'\\
msg_readerr='ZIPとして読めません。\\nこれがZIPファイルなら再取得をお勧めします。'\\
"zinfo_items=[u'サイズ ',u'年-月-日',u'時:分',u'ファイル名']"\\
"zinfo_widths=[9,10,5,4]"\\
zinfo_files='件'\\
param='引数'

※ また逐一uunzip実行の度に、これらのコマンドオプションを手打ちやコピペするのは
非効率だ。確実なコマンドオプションの組合せが作成出来たなら、それをLinuxなら
シェルスクリプト、Windowsならバッチファイルにしてしまえば良いだろうし、他の
周辺ユーザにも提供したいなら、当方のBlogに連絡頂ければ適切な言語区分で機能する
様対処するつもりだ。

 同様に、このヘルプ文書(help_txt)も理論的には翻訳すれば同様の方法で可能かも
しれないが、引数で渡すにはあまりに大き過ぎるので、テキストファイル(help_file)
で指定出来る様にしている。このヘルプ文書の他言語訳または独自のヘルプ文書を書き
込んだファイルが、変数help_fileの示すパス存在すれば、そちらが優先表示される。

【コマンドオプションについて】
 以下の仕様で一部変数の既定値を変更可能です(変更可能な全変数は末尾を参照)。

<変数名>=<値> : 単一の整数、浮動小数点、論理値、None等
<変数名>='<値>' : 半角英数による文字列
<変数名>=u'<値>' : 日本語文字列等のUNICODE文字列
<変数名>=[<数値>, ...] : 数値の配列リスト
"<変数名>=['<値>', ...]" : 文字列の配列リスト
"<変数名>=[u'<値>', ...]" : UNICODE文字列の配列リスト

※ 蛇足ながら解凍後のファイル中の文字コード自体は当然圧縮時のままです。ファイル
の中身のコード変換は例えばnkf辺りがその守備範囲だ。そこ辺りを探って頂きたい。

【解凍先での上書きトラブル対応】
 また、解凍先に解凍ファイルと同じ名のファイルがある場合は、以下の様にその対応を
オリジナルのunzip同様、選択出来る様にしている。

%s

 [y]es : 上書きとする。※ 既存のファイルは復活出来ない。
 [n]o : 上書きしない。※ ファイルは既存のままで整合検査が必要なことも。
 [A]ll : 全てを上書き。※ 既存のファイルがあれば、それは復活出来ない。
 [N]one : 処理を中止。 ※ もう、何(None)もしません(笑)。
 [r]ename : 別名前で実行。※ オリジナルのunzipと異なり新ファイル名候補も提示。

 尚、「[r]ename」ではファイル名の末尾に数字を附加したファイル名を生成し候補と
して提示する。それで是なら改行、否ならCtrl+Shift+CとCtrl+Shift+Vでコピペする等
して、ファイル名入力し改行することになる。そうして、指定したファイル名が重複
していないなら解凍が実行され、不意の上書きは防止出来る。
 しかし、このuunzip(旧称unzip-cp932)には<解凍先ディレクトリ>を第2引数で指定
出来るので、一つでも「overwrire?:"<file>"」と表示されたなら[N]oneで何にもせず
処理を中止して、新たに新規の解凍先名を指定しuunzipを実行しZIPの中身全てを解凍
する方が推奨出来る。新規の解凍先名のフォルダは現存しないなら自動で作成し解凍が
なされるので手間は要らないし、テキストファイルならばlinuxの標準コマンドで
「diif -du <dir1> <dir2>」とすることで差分チェックも容易に出来るからだ。

【ライセンス】
 広く活用頂く為、GPLとしてます。GPLの日本語詳細は次のURL等で確認して下さい。
http://sourceforge.jp/projects/opensource/wiki/licenses%%252FGNU_General_Public_License_version_3.0

 このuunzipは%sライセンスの公開義務等に従いうことでこのソースコードも改変し
ご活用頂けます。その場合の改変内容の公開は不具合連絡同様、下記のBlogへの
コメントで済ませて下さる形で構いません。
%s

%s""" % (__version__, __date__, __author__, __url__, __license__
, ucode(variables['msg_replace'][1:] % ('<file>')), __license__, __url__
, __history__)

print help_txt

## 変更可能な変数名と値の一覧 ##
print u'【変更可能な変数と現在値】'
if variables['zip_name']: #第1引数=ZIPファイル名の値表示
print u'%s=zip : u\'%s\'' % (unicode_ljust('<%s1>' % \
(variables['param']), 8), variables['zip_name'])
else:
print u'%s=zip : None' % \
(unicode_ljust('<%s1>' % (variables['param']), 8))
if variables['dir']: #第2引数=解凍先ディレクトリの値表示
print u'%s=dir : u\'%s\'' % \
(unicode_ljust('<%s2>' % (variables['param']), 8), variables['dir'])
else:
print u'%s=dir : None' % \
(unicode_ljust('<%s2>' % (variables['param']), 8))
print u'%s=file:' % (unicode_ljust('<%s3>' % (variables['param']), 8)),
if (type(variables['selections']) is type(['list'])#第3引数=解凍指示書庫内ファイルの値表示
or type(variables['selections']) is type(('list'))):
#list、またはtupleなら、
s = u'[' # list形式で
v_list=[]
for i in variables['selections']: # list/tuple内変数値を1つずつ、
if type(i) is type('a'): # 文字列型なら、
v_list.append(u'\'%s\'' % ucode(i)) # 文字列表記で
elif type(i) is type(u'a'): # unicode文字列型なら、
v_list.append(u'u\'%s\'' % ucode(i))# unicode文字表記で
elif type(i) is type(1): # 整数型なら
v_list.append(u'%d' % (i)) # 整数として
elif type(i) is type(1.23): # 浮動小数点型なら、
v_list.append(u'%f' % (i)) # 浮動小数点として
elif type(i) is type(None): # Noneなら、
v_list.append(u'None') # Noneとして
elif type(i) is type(True): # Trueなら、
v_list.append(u'True') # Trueとして
elif type(i) is type(False): # Falseなら、
v_list.append(u'False') # Falseとしてv_listに貯込み
s += u','.join(v_list) # v_listをカンマでつなぎ追記
s += u']' # 括弧を閉じてから、
print s # 表示
else: #そうでないなら、
print variables['selections'] # Python標準出力で表示

vals = variables.keys() #変数名リストを作成し
vals.sort() #並べ替え
for v in vals: #それを1つずつ、
if v in pub_vanames: # 公開変数名の分だけ、
if v=='help_txt':
if variables[v]==None:
print u'%-13s: *** \'help_file\' not exists! ***' % (v)
else:
print u'%-13s: *** This help is loaded from help_file. ***' % (v)
elif type(variables[v]) is type('a'): # 文字列なら、
print u'%-13s: \'%s\'' % (v # 非表示の特殊文字を置替えた
, ucode(replaces(variables[v])))# unicode文字表記で表示
elif type(variables[v]) is type(u'a'): # UNICODE文字列なら、
print u'%-13s: u\'%s\'' % (v # 非表示の特殊文字を置替えた
, ucode(replaces(variables[v])))# unicode文字表記で表示
elif (type(variables[v]) is # list、またはtupleなら、
type(['list'])or type(variables[v]) is type(('list'))):
s = u'%-13s: [' % (v) # list形式で
v_list=[]
for i in variables[v]: # list/tuple内変数値を1つずつ、
if type(i) is type('a'): # 文字列型なら、
v_list.append(u'\'%s\'' % ucode(i))
# 文字列表記で
elif type(i) is type(u'a'): # unicode文字列型なら、
v_list.append(u'u\'%s\'' % ucode(i))
# unicode文字表記で
elif type(i) is type(1): # 整数型なら
v_list.append(u'%d' % (i)) # 整数として
elif type(i) is type(1.23): # 浮動小数点型なら、
v_list.append(u'%f' % (i)) # 浮動小数点として
elif type(i) is type(None): # Noneなら、
v_list.append(u'None') # Noneとして
elif type(i) is type(True): # Trueなら、
v_list.append(u'True') # Trueとして
elif type(i) is type(False): # Falseなら、
v_list.append(u'False') # Falseとしてv_listに貯込み
s += u','.join(v_list) # v_listをカンマでつなぎ追記
s += u']' # 括弧を閉じてから、
print s # 表示
else: # それ以外は
print u'%-13s: ' % (v), variables[v]# 変数名の後にpython既定表示

## 個別ファイルの解凍先への解凍処理本体 ##
def unzip(z #ZipFileオブジェクト
, unicode_name #unicode変換後のファイル名
, name #素のzip書庫内のファイル名
, filepath #zip書庫内ファイルの書出し先フルパス名
, msg_unzip=u'\rinflating: \"%s\"' #zip書庫内ファイルの解凍時のメッセージ
, bites=256): #書込み単位バイト数
u"""unzip a file from a zip file into filepath
個別ファイルの解凍先への解凍処理の本体関数、既存ファイル
の上書き判定でも同じ記述となるので冗長性解消の為に関数化
"""
print msg_unzip % (unicode_name)#解凍処理中の個別ファイル名を表示(2012-09-30)
#引用符で囲んで表示する様に変更(2012-10-01)
x = z.open(name, 'r') #ZIPファイル内の中身ファイルを開く
fpo = open(filepath, 'wb') #unicode文字列化したファイルの書込みを
d = x.read(bites) #ZIP内の個別ファイルを256biteずつ(既定)読取り
while d: #中身がある限り、ループ継続
fpo.write(d) # 解凍して行く
d = x.read(bites) # 次の256バイト(既定)を読取り、ループ折返し
x.close() #ZIPファイル内の中身ファイルを閉じる
fpo.close() #unicode文字列化したファイルを閉じる

def prn_ZipInfo(zip_name, encoding=None, encodings=[], test_all=False
, msg_zippath=u'\rfilepath:'
, zinfo_items = [u'Length ', u'Date', u'Time', u'Name'] #リスト項目名
, zinfo_widths = [9, 10, 5, 4] #リスト項目幅
, zinfo_line = u'-' #罫線用文字
, zinfo_files=u'files' #ファイル数の数詞
, msg_readerr=u'Cannot read this file as zip.' #zipとして読めないとき
):
u"""display archive infomation list in a zip file, such as 'unzip -l'
以下の様式の「unzip -l」相等の書庫情報一覧を表示する関数
既定値では以下の通り、
Length Date Time Name
--------- ---------- ----- ----
12345 2012-10-04 12:34 readme.txt
--------- -------
123456789 123 files
 但し、「unzip -l」の様にファイル長が9桁固定のままでは様式が壊れる可能性が
あるので、そこを自動調整可能な方向に仕様変更。2012-10-04
"""
from zipfile import ZipFile, BadZipfile #ZIP形式の圧縮ファイルの操作
t = zinfo_items
w = zinfo_widths
zinfo_size = u'%%%dd ' % (w[0])
print msg_zippath, zip_name #の引数を画面出力
# ZipFileオブジェクト生成 #
try:
z = ZipFile(zip_name, 'r') # 第1引数指定のZIPを読込モードで開き
except:
print msg_readerr # zipとして読めない旨表示し
return # prn_ZipInfo()を抜け
# (u_unzip()に戻りuunzip終端に)

sum , count = ZipInfo_sum(z) #総ファイルサイズ, ファイル総数
l = len('%d' % (sum)) #総ファイルサイズの表示文字数(幅)
max_len = max(w[0], l)
zinfo_header0 = u'%s %s %s %s' % (unicode_rjust(t[0], max_len)
, unicode_center(t[1], w[1]), unicode_ljust(t[2], w[2])
, t[3]) #項目名ヘッダー
zinfo_header1 = u'%s %s %s %s' % (''.ljust(max_len, '-')
, ''.ljust(w[1], '-'), ''.ljust(w[2], '-')
, ''.ljust(max(w[3], unicode_width(t[3])), '-'))
#罫線ヘッダー
cnt_str = u'%d %s' % (count, zinfo_files) #ファイル件数
zinfo_footer0=u'%s %s %s %s' % (''.ljust(max_len, '-')
, ''.ljust(w[1], ' '), ''.ljust(w[2], ' ')
, ''.ljust(unicode_width(cnt_str), '-'))
#罫線フッター
print zinfo_header0 #u' Length Date Time Name'
print zinfo_header1 #u'--------- ---------- ----- ----'
infolist = z.infolist() # 指定したZIPの書庫情報リストを取得
for info in infolist: # 書庫情報リストからファイル情報を順に取出し
print zinfo_size % (info.file_size) , # 解凍後のファイルサイズ
print u'%4d-%02d-%02d %02d:%02d' % ( # unzipでは「月-日-年」の順だか
info.date_time[:5]),# ISO準拠の「年-月-日」の仕様に
print u' \"%s\"' % ( # 空白文字を含むものをcopy&pasteする時に
ucode(info.filename, encoding, encodings, test_all))
# 有用な二重引用符囲みな仕様に
zinfo_footer1 = u'%%%dd %%s' % (w[0])
print zinfo_footer0 #u'--------- -------'
print zinfo_footer1 % (sum, cnt_str) #u'%9d %d files'

def ZipInfo_sum(z):
u"""total sizes of archive file infomation
書庫情報の総ファイル長とファイル数のタプルを返す関数
用途先: prn_ZipInfo()関数内のヘッダーとフッダーの項目幅決定で活用
"""
sum = 0 #解凍後の総ファイルサイズの初期化
infolist = z.infolist() #書庫情報リストを取得
for info in infolist: #そのリストから書庫情報を1つずつ
sum = sum + info.file_size # 解凍後の総ファイルサイズに加算
return sum, len(infolist) #総ファイル長とファイル数のタプルを返す

def exist_filename(filename #ファイルのフルパス名
, ext #補完する拡張子
, message='cannot find'): #ファイル不存在時のメッセージ
u"""file name exists in zip file archive
拡張子補完を含め、指定名のファイルの
存在を確認し在れば名前を返し無いなら
messageを表示した上でNoneを返す関数

uunzip: cannot find or open "abc.zip"
, "abc.zip.zip"
or "abc.zip.ZIP"
"""
from os.path import exists
f1 = '.'.join([filename, ext.lower()]) #第1引数+'.zip'
f2 = '.'.join([filename, ext.upper()]) #第1引数+'.ZIP'
if exists(filename): #第1引数が実在ファイルなら
return filename # 第1引数をZIPファイル名に
elif exists(f1): #第1引数+'.zip'が実在ファイルなら
return f1 # 第1引数+'.zip'をZIPファイル名に
elif exists(f2): #第1引数+'.ZIP'が実在ファイルなら
return f2 # 第1引数+'.ZIP'をZIPファイル名に
else: #第1引数のファイルは不存在なら
print message, # その旨表示して
l = unicode_width(message) # メッセージの文字長 ※全角半角未対応!!
print '\"%s\"' % (filename) # 比較したファイル名候補を
print '%s,' % (''.ljust(l-1)), # オリジナルのunzipにならい表示
print '\"%s\"' % (f1) #  但し、ファイル名の候補は比較し易い
print '%sor' % (''.ljust(l-2)), # 様に改行し頭を揃える様にした。
print '\"%s\"' % (f2) #
#exit() # ※ システム終了は、活用側記述とする
return None # Noneを返す

def and_items(list1, list0, encoding0, encoding, encodings, test_all):
u""" list of file names common to both lists of text into unicode
2つのリスト共通の文字列を返す関数(各要素は文字列に限る)
用途: 書庫情報list0と入力値list1で一致するリストの生成
"""
and_list=[] #解凍対象ファイル名のリスト
for item1 in list1: #順に
itm1 = ucode(item1, encoding0, encodings, test_all)
# 比較の為unicode文字列にしてから
i = 0
for item0 in list0: # ZIP内ファイル名一覧の中で
if itm1==ucode(item0, encoding, encodings, test_all):
# 解凍可能な完全一致の分は
and_list.append(item0) # 解凍対象ファイルリストに追加
exit # ループから抜ける
and_list = sorted(set(and_list), key=and_list.index)
return and_list #重複除去後のlistを返す

def new_name(wname, i=1, prompt=u'\rnew name[%s]: ', code='utf-8'):
u"""prompt with a file name candidate for rename
既存ファイル名と重複しない3桁の数値iを附記した候補の
ファイル名を提示した上で、ファイル名入力を促す関数
"""
from os.path import exists, splitext #ファイルの存否判定, 拡張子分離用
from sys import stdin #コマンドラインからの標準入力
root, ext = splitext(wname) #拡張子を分離し
fpath = wname #初期値には元々のファイル名をセットし
while exists(fpath): #生成文字列のファイルが存する限り、
fpath = '%s_%03d%s' % (root, i, ext)# 3桁数字附加のファイル名を生成
if exists(fpath): # 生成文字列のファイル存在なら
i += 1 # iを進め
else: # ファイルとして不存在なら
print prompt % (fpath), # それを候補として角括弧で表示し
fn = stdin.readline().strip() # ファイル名の手入力を促す
if not fn.strip()=='': # 入力があったら、
fpath = fn # それを書出ファイル名に
return fpath #ループが終わればその新ファイル名を返す
続きを読む
posted by Mire at 03:35 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年10月05日

【Linux】文字化けで解凍不能なZIPファイル用「unzip-cp932」第4版リリース

 初版リリースから、色々と手を入れて来たがようやく満足の行くレベルに達し、やることが無くなって来たので、再度、ここに掲載することにした。
 機能的には、依然、オリジナルのunzipの持つ豊富なオプションは実装していないが、ZIPの書庫情報表示、解凍対象ファイル(複数可)指定、そして、解凍対象ファイルと同名の既存ファイルがある場合のunzip同等の対応を実現したことで基本的に必要となるものは網羅出来たものと考えている。
 また、好みの問題だが、基本的に埋込みのリテラル値については関数の引数として、変数定義しているので、日本語化や文字コードを入れ替えることで、Windows側で文字化けするZIPファイルの解凍作業にも活用出来る様に変更することが出来るものと思う。

 但し、依然、インストーラは作成していないので、単独での利用に当たっては初版同様コピペでファイルを作った上で1行目を環境に合わせ修正保存後、「chmod +x」で実行モードを有効にし、「/usr/local/bin」等の環境変数PATHの及ぶ区画に移動することは、必要となっている。

 第4版のソースコードは以下の通りなので、良ければ、ご活用頂きたい。続きを読む
posted by Mire at 05:03 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年09月29日

【Linux】文字化けで解凍不能なZIPファイル用「unzip-cp932」初版リリース

 頻度は少ないもののLinux機でZIPファイルを解凍しようとしても、その中の圧縮ファイルのフォルダ名が文字化けしていることが起因となり、結果としてファイルを解凍出来ないことがある。これらは、Windows環境下同士なら問題にならないことなので、日常的にWindows機を利用している人なら取り敢えずはそちらで対処しUSBメモリー等でLinux機に持ってくれば済むことなのだが、当方の様に端末も含めLinux中心に利用している者にとってはとても困ることになる。そんなことで、Ubuntu環境ではcp932のパス名対応のオプションバッチを当てたunzipが存在するものの当方の利用しているCentOS6様のRPMパッケージはない様だったので、Pythonの標準ライブラリのみでcp932対応のunzipもどきを作成して試た。

 ここで公開の「unzip-cp932」はpythonで作成しているので、今時のLinuxであれば初めからpythonはinstallされているので、同名でファイルをコピペで作成後、1行目のpythonのinstall位置を修正し、「chmod +x ./unzip-cp932」でファイルに実行権限を付与とするだけで実行出来る様になる。

 利用法は以下の通りで、画面出力はunzipにいくらか真似て試たが、今の所、コマンドオプションとしては、ZIPファイル名(必須)と解凍先のディレクトリ位置(省略時はカレントディレクトリ)のみを有効としているだけで、オリジナルのunzipとは程遠い点はご勘弁頂きたい。気になる方は、GPLライセンスに従い、思い通りに改善し公開頂きたい。




[mire@localhost ~]$ ./unzip-cp932 /media/HD-PCTX5/2010/03/Photos20100305_from_suzu.zip ~/test_a
filepath: /media/HD-PCTX5/2010/03/Photos20100305_from_suzu.zip
inflating: 霧島登山/集合写真a.jpg
inflating: 霧島登山/集合写真b.jpg
inflating: 霧島登山/20100305/01.jpg
inflating: 霧島登山/20100305/02.jpg
inflating: 霧島登山/20100305/03.jpg
<中略>
inflating: 霧島登山/20100305/12.jpg
inflating: 霧島登山/20100305/MOVIE/01.mp4
inflating: 霧島登山/20100305/MOVIE/02.mp4

[mire@localhost ~]$
 また、最初のコマンド引数としてファイルを指定しなかったり、ヘルプを意図する「--help」や「--hh」を指定した場合には以下の様な説明書きを表示する様にしている。利用方法の確認には、そうして頂きたい。



[mire@localhost ~]$ ./unzip-cp932 --help
unzip-cp932 0.0.1 of 2012-09-28. Maintained by Mire in Japan. Send bug
reports using http://pythonlife.seesaa.net/article/294731873.html

USAGE: unzip-cp932 <a zip file> [<path for extract files into>]

利用方法: unzip-cp932 <zipファイル> [<解凍先ディレクトリ>]

※ 実行には最低で解凍対象のZIPファイル1つを指定する必要があります。
 オプションとして解凍先ディレクトリを続けて指定することが出来ますが、
unzipコマンドの様な多様なオプションは一切実装していませんし、解凍後の
ファイル中の文字コード自体は当前圧縮時のままです。中身のコード変換は
nkf辺りがその守備範囲です。そこらをあたって下さい。
 また、解凍先に解凍ファイルと同じ名のファイルがある場合は、今の所
既存ファイルの上書き喪失を回避する為、同名ファイル解凍しない仕様です。
一つでも「 already exists.」と表示されたなら<解凍先ディレクトリ>に
新規の解凍先名を指定して試て下さい。ZIPの中身全てが解凍出来る筈です。
 尚、これは公開義務等のGPLライセンスを満たす範囲で改良頂けます。
その場合の改変内容公開は不具合連絡同様に下記の当方Blogへのコメントで
済ませて頂いて構いません。
http://pythonlife.seesaa.net/article/294731873.html
[mire@localhost ~]$


 これを実現している「unzip-cp932」のソースコードは以下の通り(但し、最新公開版は次稿の【Linux】文字化けで解凍不能なZIPファイル用「unzip-cp932」第4版リリース)。
続きを読む
posted by Mire at 13:28 | Comment(1) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年02月03日

【Unicode】半角カナ全角かな置替関数0.2.7 for Python

 前稿の「文書内の全数字を算用数字表現: all2int(), str2int()」では、まだ不正処理の例外について詰めがなされていないものの、取り敢えず、文書内の数字を全て半角算用数字に置替える能力を持たせることが出来た。前稿では、漢数字に焦点を当てた処理だったが、世界には、漢数字以外に言語別に多数の数字が存在する。例えば、日頃PCで使う半角算用数字のことをアラビア数字ともいうが、実際のアラビア文化圏の数字はこれとは異なりあくまで欧州から見て、元々アラビアから輸入した文字を起源とすることから、そう呼ばれているに過ぎない。
 調べてみると、なかなか面白い。やはり、0を発見した多言語のインド文化圏を中心にちょいめには数字とは判らない数字が多く存在する。現代社会では、如何にも西欧文明が頂点を極めたかの様に欧州視点での記述で物事を認識しがちだが、数学はインド文化圏からイスラム文化圏にそして西欧のキリスト教文化圏に移入されることで、ニュートン等のキーパーソンによる発展と産業力が結び付くことで、その様に西欧文化が世界的に突出し一見普遍化したに過ぎない。
 西欧から遠い日本の和算でも微分に近いことはほぼ同時期になされいたのであり、インドイスラム由来の数字が独自の変化をとげ多数存在することは当然と言えば当然のことである。

 本稿では、イスラム圏であるペルシャ数字、アラビア・インド数字やタイ、ラオス、ビルマ等の東南アジア文化圏の数字をWikipedia等で調べ記載させて頂いた。

 ソースコードは末尾に掲載しているが、今回の拡張部分のテスト実行の結果は以下の通りだ。



[mire@localhost ~]$ python jpcode_0_2_6.py

>>>diff(test, dev2num(test))
20.デーヴァナーガリー数字を数へ
- #デーヴァナーガリー数字: '०१२३४५६७८९'
+ #デーヴァナーガリー数字: '0123456789'

>>>diff(test, num2dev(test))
21.数をデーヴァナーガリー数字へ
- #半角算用数字 : '0123456789'
+ #半角算用数字 : '०१२३४५६७८९'

>>>diff(test, per2num(test))
22.ペルシア数字を半角算用数字へ
- #ペルシア数字 : '۰۱۲۳۴۵۶۷۸۹'
+ #ペルシア数字 : '0123456789'

>>>diff(test, num2per(test))
23.半角算用数字をペルシア数字へ
- #半角算用数字 : '0123456789'
+ #半角算用数字 : '۰۱۲۳۴۵۶۷۸۹'

>>>diff(test, ara2num(test))
24.アラビア・インド数字を数字へ
- #アラビア・インド数字 : '٠١٢٣٤٥٦٧٨٩'
+ #アラビア・インド数字 : '0123456789'

>>>diff(test, num2ara(test))
25.数字をアラビア・インド数字へ
- #半角算用数字 : '0123456789'
+ #半角算用数字 : '٠١٢٣٤٥٦٧٨٩'

>>>diff(test, guj2num(test))
26.グジャラーティー数字を数字へ
- #グジャラーティー数字 : '૦૧૨૩૪૫૬૭૮૯'
+ #グジャラーティー数字 : '0123456789'

>>>diff(test, num2guj(test))
27.数字をグジャラーティー数字へ
- #半角算用数字 : '0123456789'
+ #半角算用数字 : '૦૧૨૩૪૫૬૭૮૯'

>>>diff(test, gur2num(test))
28.グルムキー数字 を 半角数字へ
- #グルムキー数字 : '੦੧੨੩੪੫੬੭੮੯'
+ #グルムキー数字 : '0123456789'

>>>diff(test, num2gur(test))
29.半角数字 を グルムキー数字へ
- #半角算用数字 : '0123456789'
+ #半角算用数字 : '੦੧੨੩੪੫੬੭੮੯'

>>>diff(test, tel2num(test))
30.テルグ数字 を 半角算用数字へ
- #テルグ数字 : '౦౧౨౩౪౫౬౭౮౯'
+ #テルグ数字 : '0123456789'

>>>diff(test, num2tel(test))
31.半角算用数字 を テルグ数字へ
- #半角算用数字 : '0123456789'
+ #半角算用数字 : '౦౧౨౩౪౫౬౭౮౯'

>>>diff(test, kan2num(test))
32.カンナダ数字を半角算用数字へ
- #カンナダ数字 : '೦೧೨೩೪೫೬೭೮೯'
+ #カンナダ数字 : '0123456789'

>>>diff(test, num2kan(test))
33.半角算用数字をカンナダ数字へ
- #半角算用数字 : '0123456789'
+ #半角算用数字 : '೦೧೨೩೪೫೬೭೮೯'

>>>diff(test, mal2num(test))
34.マラヤーラム数字を半角数字へ
- #マラヤーラム文字 : '൦൧൨൩൪൫൬൭൮൯'
+ #マラヤーラム文字 : '0123456789'

>>>diff(test, num2mal(test))
35.半角数字をマラヤーラム数字へ
- #半角算用数字 : '0123456789'
+ #半角算用数字 : '൦൧൨൩൪൫൬൭൮൯'

>>>diff(test, tam3num(test))
36.タミル数字 を 半角算用数字へ
- #タミル数字 : '௦௧௨௩௪௫௬௭௮'
+ #タミル数字 : '012345678'

>>>diff(test, num2tam(test))
37.半角算用数字 を タミル数字へ
- #半角算用数字 : '0123456789'
+ #半角算用数字 : '௦௧௨௩௪௫௬௭௮௯'

>>>diff(test, ban2num(test))
38.ベンガル数字を半角算用数字へ
- #ベンガル数字 : '০১২৩৪৫৬৭৮৯'
+ #ベンガル数字 : '0123456789'

>>>diff(test, num2ban(test))
39.半角算用数字をベンガル数字へ
- #半角算用数字 : '0123456789'
+ #半角算用数字 : '০১২৩৪৫৬৭৮৯'

>>>diff(test, ori2num(test))
40.オリヤー数字を半角算用数字へ
- #オリヤー数字 : '୦୧୨୩୪୫୬୭୮୯'
+ #オリヤー数字 : '0123456789'

>>>diff(test, num2ori(test))
41.半角算用数字をオリヤー数字へ
- #半角算用数字 : '0123456789'
+ #半角算用数字 : '୦୧୨୩୪୫୬୭୮୯'

>>>diff(test, bur2num(test))
42.ビルマ数字 を 半角算用数字へ
- #ビルマ数字 : '၀၁၂၃၄၅၆၇၈၉'
+ #ビルマ数字 : '0123456789'

>>>diff(test, num2bur(test))
43.半角算用数字 を ビルマ数字へ
- #半角算用数字 : '0123456789'
+ #半角算用数字 : '၀၁၂၃၄၅၆၇၈၉'

>>>diff(test, khm2num(test))
44.クメール数字を半角算用数字へ
- #クメール数字 : '០១២៣៤៥៦៧៨៩'
+ #クメール数字 : '0123456789'

>>>diff(test, num2khm(test))
45.半角算用数字をクメール数字へ
- #半角算用数字 : '0123456789'
+ #半角算用数字 : '០១២៣៤៥៦៧៨៩'

>>>diff(test, tha2num(test))
46.タイ数字 を 半角算用数字へ
- #タイ数字 : '๐๑๒๓๔๕๖๗๘๙'
+ #タイ数字 : '0123456789'

>>>diff(test, num2tha(test))
47.半角算用数字 を タイ数字へ

>>>diff(test, lao2num(test))
48.ラーオ数字 を 半角算用数字へ
- #ラーオ数字 : '໐໑໒໓໔໕໖໗໘໙'
+ #ラーオ数字 : '0123456789'

>>>diff(test, num2lao(test))
49.半角算用数字 を ラーオ数字へ
- #半角算用数字 : '0123456789'
+ #半角算用数字 : '໐໑໒໓໔໕໖໗໘໙'

>>>diff(test, tib2num(test))
50.チベット数字を半角算用数字へ
- #チベット数字 : '༠༡༢༣༤༥༦༧༨༩'
+ #チベット数字 : '0123456789'

>>>diff(test, num2tib(test))
51.半角算用数字をチベット数字へ
- #半角算用数字 : '0123456789'
+ #半角算用数字 : '༠༡༢༣༤༥༦༧༨༩'
>>>print all2int(test)

#全数字文字を含む文字列: '拾百千万億兆京垓予穣溝潤正'
#全数字文字を含む文字列: '零千壱正弐潤参溝四穣五予六垓七京八兆九億壱万弐千参百四拾五'
#半角算用数字 : '0123456789'
#全角算用数字 : '0123456789'
#全角漢数字 : '〇一二三四五六七八九'
#全角漢数字(大字) : '〇壱弐参零壹貮貳參肆伍陸柒漆質捌玖'
#全角漢数字(大字) : '零壹贰貳叁參肆伍陆陸柒柒漆捌玖'
#デーヴァナーガリー数字: '०१२३४५६७८९'
#ペルシア数字 : '۰۱۲۳۴۵۶۷۸۹'
#アラビア・インド数字 : '٠١٢٣٤٥٦٧٨٩'
#グジャラーティー数字 : '૦૧૨૩૪૫૬૭૮૯'
#グルムキー数字 : '੦੧੨੩੪੫੬੭੮੯'
#テルグ数字 : '౦౧౨౩౪౫౬౭౮౯'
#カンナダ数字 : '೦೧೨೩೪೫೬೭೮೯'
#マラヤーラム文字 : '൦൧൨൩൪൫൬൭൮൯'
#タミル数字 : '௦௧௨௩௪௫௬௭௮௯'
#ベンガル数字 : '০১২৩৪৫৬৭৮৯'
#オリヤー数字 : '୦୧୨୩୪୫୬୭୮୯'
#ビルマ数字 : '၀၁၂၃၄၅၆၇၈၉'
#クメール数字 : '០១២៣៤៥៦៧៨៩'
#タイ数字 : '๐๑๒๓๔๕๖๗๘๙'
#ラーオ数字 : '໐໑໒໓໔໕໖໗໘໙'
#チベット数字 : '༠༡༢༣༤༥༦༧༨༩'

文中の数字を整数で表示

#全数字文字を含む文字列: '100000'
#全数字文字を含む文字列: '10002000300040005000600070008000900012345'
#半角算用数字 : '123456789'
#全角算用数字 : '123456789'
#全角漢数字 : '123456789'
#全角漢数字(大字) : '1230122345677789'
#全角漢数字(大字) : '12233456677789'
#デーヴァナーガリー数字: '123456789'
#ペルシア数字 : '123456789'
#アラビア・インド数字 : '123456789'
#グジャラーティー数字 : '123456789'
#グルムキー数字 : '123456789'
#テルグ数字 : '123456789'
#カンナダ数字 : '123456789'
#マラヤーラム文字 : '123456789'
#タミル数字 : '123456789'
#ベンガル数字 : '123456789'
#オリヤー数字 : '123456789'
#ビルマ数字 : '123456789'
#クメール数字 : '123456789'
#タイ数字 : '123456789'
#ラーオ数字 : '123456789'
#チベット数字 : '123456789'

[mire@localhost ~]$

 実を言うと、このソースコードは「【Unicode】半角カナ全角かな置替関数 for Python(正式公開版)」のソースに上書きする予定だったが、ここ迄長いソースになると書込み出来なかったので、仕方なく新規の投稿での全コード掲載とさせて頂いた。
            /usr/lib/python2.6/site-packages/mire/jcode.py(前半)


#!/usr/loca/bin/python2.6
# -*- coding: utf-8 -*-
"""
######################################################################
# replacement of japanese full and half pitch characters
# 全角/半角仮名ASCII文字置替
# 1. zen_conv( s : 文字列s内の半角/全角カナASCII文字の置替え
# , mode : None = 設定なし
# : 'han2kata' = 1.半角カタカナを全角カタカナへ(既定値)
# : 'kata2han' = 2.全角カタカナを半角カタカナへ
# : 'han2hira' = 3.半角カタカナを全角ひらがなへ
# : 'hira2han' = 4.全角ひらがなを半角カタカナへ
# : 'asc2zen' = 5.半角英数記号を全角英数記号へ
# : 'zen2asc' = 6.全角英数記号を半角英数記号へ
# : 'han2zen' = 7.半角カタカナ英数記号を全角へ
# : 'zen2han' = 8.全角仮名文字英数記号を半角へ
# : 'kata2hira' = 9.全角カタカナを全角ひらがなへ
# : 'hira2kata' =10.全角ひらがなを全角カタカナへ
# : 'kana2han' =11.全角平片仮名を半角カタカナへ
# : 'num2zen' =12.半角算用数字を全角算用数字へ
# : 'num2han' =13.全角算用数字を半角算用数字へ
# : 'num2knm' =14.半角算用数字を普通の漢数字へ
# : 'knm2num' =15.普通の漢数字を半角算用数字へ
# : 'num2dai' =16.半角算用数字を大字表記数字へ
# : 'dai2num' =17.大字表記数字を半角算用数字へ
# : 'knm2dai' =18.普通の漢数字を大字表記数字へ
# : 'dai2knm' =19.大字表記数字を普通の漢数字へ
# : 'dev2num' :20.デーヴァナーガリー数字を数へ
# : 'num2dev' :21.数をデーヴァナーガリー数字へ
# : 'per2num' :22.ペルシア数字を半角算用数字へ
# : 'num2per' :23.半角算用数字をペルシア数字へ
# : 'ara2num' :24.アラビア・インド数字を数字へ
# : 'num2ara' :25.数字をアラビア・インド数字へ
# : 'guj2num' :26.グジャラーティー数字を数字へ
# : 'num2guj' :27.数字をグジャラーティー数字へ
# : 'gur2num' :28.グルムキー数字 を 半角数字へ
# : 'num2gur' :29.半角数字 を グルムキー数字へ
# : 'tel2num' :30.テルグ数字 を 半角算用数字へ
# : 'num2tel' :31.半角算用数字 を テルグ数字へ
# : 'kan2num' :32.カンナダ数字を半角算用数字へ
# : 'num2kan' :33.半角算用数字をカンナダ数字へ
# : 'mal2num' :34.マラヤーラム数字を半角数字へ
# : 'num2mal' :35.半角数字をマラヤーラム数字へ
# : 'tam3num' :36.タミル数字 を 半角算用数字へ
# : 'num2tam' :37.半角算用数字 を タミル数字へ
# : 'ban2num' :38.ベンガル数字を半角算用数字へ
# : 'num2ban' :39.半角算用数字をベンガル数字へ
# : 'ori2num' :40.オリヤー数字を半角算用数字へ
# : 'num2ori' :41.半角算用数字をオリヤー数字へ
# : 'bur2num' :42.ビルマ数字 を 半角算用数字へ
# : 'num2bur' :43.半角算用数字 を ビルマ数字へ
# : 'khm2num' :44.クメール数字を半角算用数字へ
# : 'num2khm' :45.半角算用数字をクメール数字へ
# : 'tha2num' :46.タイ数字 を 半角算用数字へ
# : 'num2tha' :47.半角算用数字 を タイ数字へ
# : 'lao2num' :48.ラーオ数字 を 半角算用数字へ
# : 'num2lao' :49.半角算用数字 を ラーオ数字へ
# : 'tib2num' :50.チベット数字を半角算用数字へ
# : 'num2tib' :51.半角算用数字をチベット数字へ
# : ※これ以外の指定は'han2kata'の全角カタカナへとなる
# , yen : 「\」を「¥」(既定値)以外で置替えたい文字列を指定
# : 例: 「\」に置替えなら、yen=u'\'
# : 置替えしないなら、 yen=None とする
# , alt_dic : 置替辞書へmap修正追加するものを辞書で指定
# : 例: 矢印を半角文字で表現, 全角スペースを半角2つに置替え
# : alt_dic={u'⇒':'=>', u' ':' '}
# , del_list : 置替辞書から除去する文字をlistで指定
# , my_dic : 固有の置替辞書を指定
# , pass_list: 置替除外する部分をlistで指定
# , debug) : 0:何もしない(既定値), 1以上:debugの為の情報表示あり
# modeの命名規則 : 全角ひらがな=hira, 全角カタカナ=kata, 半角=han, 全角=zen
# , ' to '='2', 半角英数記号(ascii)=asc, 半角算用数字=num
# , 普通の漢数字=knm, 大字表記数字=dai
# ※ 全て置替用辞書に依存し置替する仕組み。正順一致で置替える
#
# 2.replaces( s : 標準関数replace(s, old, new)の様な文字列sの置替関数
# , alt_dic : 上記のreplace()のoldをnewの対を辞書に指定(複数)
# , pass_list : 変換しない領域の文字列をリスト内に指定
# , mode=None : 必要により、z_conv()のmodeで置替辞書を指定
# , del_list=[]: 置替辞書から除去する文字をlistで指定
# , my_dic={} : 固有の置替辞書を指定
# , yen=u'¥' : 「\」を「¥」(既定値)以外で置替えたい文字列を指定
# , debug=0 ): 0:何もしない(既定値), 1以上:debugの為の情報表示あり
#
# 3.モード別関数(関数名のmodeを既定で指定済, zen_conv()関数の全引数の指定が可能)
# 半角カタカナを全角カタカナへ: han2kata() 全角カタカナを半角カタカナへ: kata2han()
# 半角カタカナを全角ひらがなへ: han2hira() 全角ひらがなを半角カタカナへ: hira2han()
# 半角英数記号を全角英数記号へ: asc2zen() 全角英数記号を半角英数記号へ: zen2asc()
# 半角カタカナ英数記号を全角へ: han2zen() 全角カタカナ英数記号を半角へ: zen2han()
# 全角カタカナを全角ひらがなへ: kata2hira() 全角ひらがなを全角カタカナへ: hira2kata()
# 全角平片仮名を半角カタカナへ: kana2han()
# 半角算用数字を全角算用数字へ: num2zen() 全角算用数字を半角算用数字へ: num2han()
# 半角算用数字を普通の漢数字へ: num2knm() 普通の漢数字を半角算用数字へ: knm2num()
# 半角算用数字を大字表記数字へ: num2dai() 大字表記数字を半角算用数字へ: dai2num()
# 普通の漢数字を大字表記数字へ: knm2dai() 大字表記数字を普通の漢数字へ: dai2knm()
# デーヴァナーガリー数字を数へ: dev2num() 数をデーヴァナーガリー数字へ: num2dev()
# ペルシア数字を半角算用数字へ: per2num() 半角算用数字をペルシア数字へ: num2per()
# アラビア・インド数字を数字へ: ara2num() 数字をアラビア・インド数字へ: num2ara()
# グジャラーティー数字を数字へ: guj2num() 数字をグジャラーティー数字へ: num2guj()
# グルムキー数字 を 半角数字へ: gur2num() 半角数字 を グルムキー数字へ: num2gur()
# テルグ数字 を 半角算用数字へ: tel2num() 半角算用数字 を テルグ数字へ: num2tel()
# カンナダ数字を半角算用数字へ: kan2num() 半角算用数字をカンナダ数字へ: num2kan()
# マラヤーラム数字を半角数字へ: mal2num() 半角数字をマラヤーラム数字へ: num2mal()
# タミル数字 を 半角算用数字へ: tam3num() 半角算用数字 を タミル数字へ: num2tam()
# ベンガル数字を半角算用数字へ: ban2num() 半角算用数字をベンガル数字へ: num2ban()
# オリヤー数字を半角算用数字へ: ori2num() 半角算用数字をオリヤー数字へ: num2ori()
# ビルマ数字 を 半角算用数字へ: bur2num() 半角算用数字 を ビルマ数字へ: num2bur()
# クメール数字を半角算用数字へ: khm2num() 半角算用数字をクメール数字へ: num2khm()
# タイ数字 を 半角算用数字へ: tha2num() 半角算用数字 を タイ数字へ: num2tha()
# ラーオ数字 を 半角算用数字へ: lao2num() 半角算用数字 を ラーオ数字へ: num2lao()
# チベット数字を半角算用数字へ: tib2num() 半角算用数字をチベット数字へ: num2tib()
#
# 4.数字文字置替関数
# str2int(s) : 漢数字全角数字含めた数字を整数値化
# all2int(s) : 文字列内の数字を算用数字の整数に置替え

#【更新履歴】
# 2010-05-05 0.0.0  kana2zen()として半角カナを全角のカタカナひらがなへの
# 置替機能及び、そのテストコードを公開
# 2010-05-06 0.0.1  半角への逆置替が欲しくなったので機能拡張し、kana_conv()
# としたdebug時に参照辞書の一部を確認可能にし、指定ミスを
# 発見し易くした長音記号等漏れ等の誤りを補正。多分精度的には
# まだα1クラス。
# 2012-01-13 0.0.1a  通りすがりさんご指摘の'け''ケ'のマッピングミスを修正
# 2012-01-14 0.0.2  この__DOC__のmode名hiraをhan2hiraに変更、その他も改変
# ※0.0.1a以前と非互換。今後は新命名規則でmode名を決定
# 2012-01-15 0.1.0  全角英数記号文字の半角置替をzen2han、その逆をhan2zen
# として追加半角英数記号の全角置替をasc2zen、その逆をzen2asc
# として追加し、関数名をzen_conv()に変更
# 2012-01-16 0.1.0a  引数 yen, alt_dic, del_list, my_dic を追加し個別用途の
# 置替需要に応える様に拡張開始
# 2012-01-16 0.1.1  alt_dic で追加したものに濁点半濁点が処理出来ない不具合解消
# 2012-01-19 0.1.2  利用時タイプの冗長性を軽減の為、mode別関数を作成展開
# 2012-01-22 0.1.2a  コード整理に伴なう軽微な修正とclean up
# 2012-01-22 0.2.0  置替え処理を文字列の頭から正順処理する様に修正(100行→40行)
# 置替文字数上限をなくした。逆順処理はコメント化
# 2012-01-23 0.2.1  辞書との比較を頭文字から始まる文字数分の部分文字列に変更により
# 同一頭文字の多キー存在時のループ回数を低減
# 2012-01-23 0.2.2  pass_listでキー文字列と同じ値の辞書要素を登録し一致分は
# 変更しない様にすることで置替除外箇所の指定を可能にし汎用性を向上
# 2012-01-25 0.2.3  置替用辞書として半角数字と全角数字間置替えするものを追加すると共に
# 置替辞書なしを文字列'None'で指定可能にし、単純な文字列置替関数としての
# 用途にも可能なより汎用的仕様に変更
# 2012-01-26 0.2.4 一般受け狙い?(笑)の汎用関数replaces()追加
# 2012-01-28 0.2.5 整数文字列の整数化関数str2int()の追加
# 2012-01-29 0.2.6 文字列内の整数文字列の算用数字化関数all2int()の追加
# 2012-02-03 0.2.7 アジア地域言語の数文字を追加
#
#【判っている課題】
# my_dic: 著者未使用の為、利用の成否は未確認。
# 数字置替系関数は単純な数字文字間の置替えのみサポート。
# 文字列中の小数点付数字は未対応
# clean up不足 sorry
"""
__author__ = "Mire in Japan"
__date__ = "2012-02-03"
__version__ = '0.2.7'
__copyright__ = 'Copyright (c) 2010-2012 Mire'
__license__ = 'GPL'
__url__ = 'http://pythonlife.seesaa.net/article/247825731.htm '

def replaces(s, alt_dic={}, pass_list=[], mode='None', del_list=[], my_dic={}
, yen=u'¥', debug=0):
"""
複数の文字列の置替ペアの辞書指定して、文字列s上の合致部分を置替た文字列を返す関数
replaces( s : 標準関数replace(s, old, new)の様な文字列sの置替関数
, alt_dic : 上記のreplace()のoldをnewの対を辞書に指定(複数)
, pass_list : 変換しない領域の文字列をリスト内に指定
, mode=None : 必要により、z_conv()のmodeで置替辞書を指定
, del_list=[]: 置替辞書から除去する文字をlistで指定
, my_dic={} : 固有の置替辞書を指定
, yen=u'¥' : 「\」を「¥」(既定値)以外で置替えたい文字列を指定
, debug=0 ): 0:何もしない(既定値), 1以上:debugの為の情報表示あり
"""
return zen_conv(s, mode=mode, alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

allknum = u''

def han2kata(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角カタカナを全角カタカナへ"""
return zen_conv(s, mode='han2kata', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def kata2han(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角カタカナを半角カタカナへ"""
return zen_conv(s, mode='kata2han', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def han2hira(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角カタカナを全角ひらがなへ"""
return zen_conv(s, mode='han2hira', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def hira2han(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角ひらがなを半角カタカナへ"""
return zen_conv(s, mode='hira2han', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def asc2zen(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角英数記号を全角英数記号へ"""
return zen_conv(s, mode='asc2zen', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def zen2asc(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角英数記号を半角英数記号へ"""
return zen_conv(s, mode='zen2asc', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def han2zen(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角カタカナ英数記号を全角へ"""
return zen_conv(s, mode='han2zen', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def zen2han(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角仮名文字英数記号を半角へ"""
return zen_conv(s, mode='zen2han', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def kata2hira(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角カタカナを全角ひらがなへ"""
return zen_conv(s, mode='kata2hira', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def hira2kata(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角ひらがなを全角カタカナへ"""
return zen_conv(s, mode='hira2kata', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def kana2han(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角平片仮名を半角カタカナへ"""
return zen_conv(s, mode='kana2han', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def num2zen(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角算用数字を全角算用数字へ"""
return zen_conv(s, mode='num2zen', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def num2han(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角算用数字を半角算用数字へ"""
return zen_conv(s, mode='num2han', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def num2knm(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角算用数字を普通の漢数字へ"""
return zen_conv(s, mode='num2knm', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def knm2num(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""普通の漢数字を半角算用数字へ"""
return zen_conv(s, mode='knm2num', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def knm2dai(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""普通の漢数字を大字表記数字へ"""
return zen_conv(s, mode='knm2dai', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def dai2knm(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""大字表記数字を普通の漢数字へ"""
return zen_conv(s, mode='dai2knm', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def num2dai(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""普通の漢数字を大字表記数字へ"""
return zen_conv(s, mode='num2dai', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def dai2num(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""大字表記数字を普通の漢数字へ"""
return zen_conv(s, mode='dai2num', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

続きを読む
posted by Mire at 16:02 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年01月29日

文書内の全数字を算用数字表現: all2int(), str2int()

 文字列の汎用置替えでは画一的なパターンで画一的に処理する為、必ずしも全てが妥当な置替え結果を得れるものではない。このことは、例えば文書中の数字表記で考えて頂ければ判りやすいだろう。
 「領収額 金壱億弐百参万円也」「面積 百弐拾参・四五坪」通常縦書きの契約書類等で用いられる表記方法である。漢数字も大字と言う改竄防止の画数の多い文字が使われている点は単純にdai2num()でも「領収額 金1億2百3万円也」「面積 百2拾3・45坪」の様に置替えて読み易くすること迄は出来る。
 しかし、これら全てを算用数字に一発で置替えようとすると億、万、百、拾と言う位を表す文字の扱いが問題になる。言わばint(u'1億2百3万')で102030000と言う整数値が生成出来る様にする必要が出て来る。それに応えるものが、今回説明するmire.jcode.str2int()関数である。それに前稿のreplaces()関数を絡めれば、「領収額 金102030000円也」「面積 123・45坪」の様に算用数字表記の整数に置替えることが出来る。

 先ずはmire.jcode.str2int()関数のコードは次の通りだ。仕様は標準のint()同様、数字以外の文字を含むと期待する以外の結果を生む可能性がある仕様としている。また例えば百円とか千円と言うと日本では100円とか1000円の意味であり壱が省略されたものとして対処する仕様としている。
続きを読む
posted by Mire at 19:39 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

辞書指定で複数置替え可能なreplaces()文字列置替関数

 Pythonには文字列メソッドreplace()がある。これはとても便利で1つ2つの置換文字列の指定程度なら何の問題もない。しかし、文字列メソッドreplace()には同時に置替部分文字列を一組しか指定出来ないので置替対象の部分文字列の数が多くなると、その回数分文字列を舐め回すことになり効率が悪い。複数の置替部分文字列の組合せを辞書で一括指定し文字列の先頭から一度のスキャンでreplace出来れば有用である。
 実際、この機能は前稿の中核関数であるzen_conv()に基本機能を内蔵しているので、以下の様に引数を調整するだけで作れてしまう。



def replaces(s, alt_dic={}, pass_list=[], mode='None', del_list=[], my_dic={}
, yen=u'¥', debug=0):
"""
複数の文字列の置替ペアの辞書指定して、文字列s上の合致部分を置替た文字列を返す関数
replaces( s : 標準関数replace(s, old, new)の様な文字列sの置替関数
, alt_dic : 上記のreplace()のoldをnewの対を辞書に指定(複数)
, pass_list : 変換しない領域の文字列をリスト内に指定
, mode=None : 必要により、z_conv()のmodeで置替辞書を指定
, del_list=[]: 置替辞書から除去する文字をlistで指定
, my_dic={} : 固有の置替辞書を指定
, yen=u'¥' : 「\」を「¥」(既定値)以外で置替えたい文字列を指定
, debug=0 ): 0:何もしない(既定値), 1以上:debugの為の情報表示あり
"""
return zen_conv(s, mode=mode, alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
 文字列メソッドreplace()との大きな差は関数という仕様の為、第一引数に文字列オブジェクトを指定することになること以外は、count引数がないことくらいだ。後はzen_conv()関数の残りの引数を既定値で埋めただけの仕様なので、必要により半角と全角の置替えも一度で処理出来る。実用例は次稿の関数all2int内で利用しているのでここでは割愛させて頂くが、前稿の/usr/lib/python2.6/site-packages/mire/jpcode.pyをInstallして頂き次の様にする。



from mire.jpcode import replaces
test_str = u'テスト文字列...'
print replaces(test_str, {u'置き換え':u'置換え', u'デフォルト値':u'既定値'})
 もし、半角カナを全角カナに同時に変更するなら、引数mode='han2kata'を追加指定するば同時に処理することが出来る。内部処理としては、辞書はhan2kataに追加され、テスト文字列を一文字ずつ読込み、その文字と頭文字が一致する辞書の要素がある場合に、その最大文字数の要素から全一致するものを探し、あれば辞書の値に置替えてその要素文字数だけ先に処理を進める方式なので効率は良い筈である。機会があれば利用頂ければ有難い。
posted by Mire at 13:27 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年01月22日

【Unicode】半角カナ全角かな置替関数 for Python(正式公開版)

 先日よりPythonによる首記の半角カナと全角かなの置替関数の機能強化とそれに伴なう不具合の解消に取組んで来ていた訳だが、ようやく動作面ではあまり恥ずかしくない実用レベルになったので本稿で正式公開させて頂くことにする。但し置替辞書については依然充分でないかもしれないので利用した上で不具合があれば、引続きコメントを頂けると有難い。

【プログラム名】「半角カナ全角かな置替関数」モジュール
 今回より、この「半角カナ全角かな置替関数」モジュールと称することにする。従来は変換という言葉を使っていた訳だが、「かな変換」というシステムを連想させてしまうので、好ましくないと思ったからである。但し0.2.0での正順比較化以降は用途は辞書次第で日本語以外にも対応する様になった(筈な)ので、今後の辞書次第で再度名称変更となるかもしれない。

【機能と想定用途】
 日本語環境で同意の文字として登録されている半角の「カタカナ、ひらがな、英数記号」と全角の「カタカナ、ひらがな、英数記号」文字をクロスオーバー的に一括置替することで、読み易くしたり、JIS、Sift_JISやEUC-JP等他の文字コード等へ変換出力する際の文字化けを回避する等の利用を想定している。現在、Python2.x系での活用を前提に開発。

【制 限 事 項】
 濁点半濁点付きの半角カタカナ「ガ」の様に複数文字で記述するものを全角カタカナ「ガ」に置替えることが可能であり、且つ、任意の置替パターンを辞書に登録することが可能だが、それは2文字迄の対応となっている。
 また、その処理は文字列の末尾から濁点半濁点に相当する2文字目の文字候補を探して処理を進める為、頭から見て行く場合とは異なる変換を行なう特殊な場合があるやも知れない。文字で並べた言葉は機械的に切れ目が不明確な為切り方により意味が変わってしまう場合がある。例えば「シンダイシャタノム」という電報が受け手は状況が判れば「寝台車頼む」と解釈するが、「死んだ。医者頼む」と読んで医者に死亡確認と死亡診断書の発行を依頼するかもしれないし、「死んだ医者(を)頼む」と読んでしまい思考が停止する可能性も無しと迄は言いきれない。このプログラムは意識を持たないので思考停止の可能性はないがその代わりに決め打ちで処理結果を返すだけなので、後先の優先くらいしか対処出来ていない。無論日本語の濁点半濁点だけならば、濁点半濁点文字自体が本字となり濁点や半濁点を伴なう使い方は無いし、丸と点々の2つだけなので、「シンダイシャタノム」型の不具合は発生しない。この点は「alt_dic」で指定する独自の変換パターンを追加した際に似た様なことが起こり得ることを頭の隅に置いて居て頂きたい。「死んだ。医者頼む」と処理しても「新台車『タノム』」が正しかったりする場合の対処法はひたすら利用者の条件適用に依存するのみである。具体的には、半角で矢印を表すとき「->」や「<-」とすることがあるかと思う。でもこれを「alt_dic」に指定すると「-」(マイナス記号)は処理上では濁点半濁点と同じ扱いを受けるが同時に濁点半濁点を伴なう親字とも成り得る。ここでさらに「--」を長いハイフン記号として解釈して罫線記号「─」を割り当てる様に指定してしまうと「<-->」は「←→」「<─>」の両方の解釈の余地が生じてしまう。当方の後方から攻めると「<--->」は「<─→」に、コードを改めて頭から処理する様に変更したら「←─>」と異なる結果を生むことになる。そんな場合には予め文字列メソッドの「replace(str, old, new])」辺りでnewに「←-→」等と作成者の意図通りの文字列に置替えてからの利用となる。0.2.0以降では文字列を頭より正順比較し置替辞書により置替える使用とし、キーとなる文字列の長さに制限はないので、以上の点を充分に心に留置き頂きたい。

【Install方法】
 本稿掲載の「jpcode.py」全体をドラッグ選択しコピーし、「jpcode.py」を作成し、利用するpythonディレクトリにある「site-packages」に入れる。これによりPythonの標準モジュールと同じ様にimportが可能になる。ただ、「jpcode.py」のままでは、他資産とバッティングする可能性があるので以下設定例の様に、「site-packages」の下に「mire」(当方のHN)ディレクトリを作成しその中に入れた方が賢明かと思う。



[mire@localhost ~]$ cd /usr/lib/python2.6/site-packages/
[mire@localhost site-packages]$ sudo mkdir mire
[sudo] password for mire:
[mire@localhost site-packages]$ cd mire/
[mire@localhost mire]$ sudo cp ~/jpcode.py ./
[mire@localhost mire]$ sudo echo > ~/__init__.py
[mire@localhost mire]$ sudo cp ~/__init__.py ./
[mire@localhost mire]$ ls -la
合計 64
drwxr-xr-x. 2 root root 4096 1月 21 04:36 2012 .
drwxr-xr-x. 34 root root 4096 1月 21 04:31 2012 ..
-rw-r--r--. 1 root root 1 1月 21 04:36 2012 __init__.py
-rw-r--r--. 1 root root 51402 1月 21 04:32 2012 jpcode.py
[mire@localhost mire]$
[mire@localhost mire]$ cd ~
これはLinux上での「site-packages」にモジュール用のフォルダ「mire」を作成しその中に「jpcode.py」を入れる他、「__init__.py」という名の空ファイルを入れる操作。

【使  い  方】
 第1引数に置替対象文字列を指定して関数を実行することで、modeで指定したモードまたは専用関数の置替辞書の対応に従い文字を置替えた処理文字列を返す。各モードの基本辞書は関数に埋め込んでいるので逐次作成する必要性あまりないだろうが、独自の辞書をmy_dicで指定することで全く独自の置替処理を実現することも出来る。また置替対象文字列内に、各モードの基本辞書では過不足が発生する場合には、alt_dicで追加修正をdel_listで余計なものを除去することが出来る。
 また、ASCIIコードの「\」(バックスラッシュは)、日本語環境では半角の「¥」(円マーク)として使うことが一般的だが、最近ではバックスラッシュのままで表示される環境も多い。そんな場合には、全角文字の「\」(バックスラッシュ)に置替えるべく、yen=u'\'とすることも出来るし、ソースコード内のエスケープ文字として(例えば改行文字の\n等)ASCIIコードの「\」を使っている場合はyen=Noneとして置替辞書かせ除去し処理しない様にすることも出来る。任意の場所に以下サンプルコードの様にpythonのソースコードを書いて、「python example.py」とするか、または、「chmod 755 example.py」としてファイルに実行権限を与え「sample.py」で実行する。

 sample.py


#!/usr/bin/python2.6
# -*- coding: utf8 -*-

u"""
asc2zen:半角英数記号を全角化に演算子矢印置替追加例
"""
def exam_asc2zen_plus_allows(s):
from jpcode import zen_conv, asc2zen #必要な関数をimportする
print u'%s:「%s」 ⇒ 「%s」' % (
__doc__.strip()
, s
, asc2zen(s
, alt_dic={ '*':u'×', '/':u'÷' #乗除「×」「÷」
, '<-':u'←', '->':u'→'})) #矢印「←」「→」

if __name__ == '__main__':
exam_asc2zen_plus_allows(u'+-*/<- ->')
このコードを実行すると以下の様にalt_dicで指定した辞書に従い置替えが出来る。



[mire@localhost ~]$ python example.py
asc2zen:半角英数記号を全角化に演算子矢印置替追加例:「+-*/<- ->」 ⇒ 「+−×÷← →」
[mire@localhost ~]$


【ソースコード】
 ソースコードは以下の通りだ。コピペでファイルを作成してから、ご活用頂きたい。[2012-01-23修正, 2012-01-24再修正。2012-01-29再々修正。(修正箇所はコメントさせて頂いた。)]
          /usr/lib/site-packages/mire/jpcode.py (最新版)


#!/usr/loca/bin/python2.6
# -*- coding: utf-8 -*-
"""
######################################################################
# replacement of japanese full and half pitch characters
# 全角/半角仮名ASCII文字置替
# 1. zen_conv( s : 文字列s内の半角/全角カナASCII文字の置替え
# , mode : None = 設定なし
# : 'han2kata' = 1.半角カタカナを全角カタカナへ(既定値)
# : 'kata2han' = 2.全角カタカナを半角カタカナへ
# : 'han2hira' = 3.半角カタカナを全角ひらがなへ
# : 'hira2han' = 4.全角ひらがなを半角カタカナへ
# : 'asc2zen' = 5.半角英数記号を全角英数記号へ
# : 'zen2asc' = 6.全角英数記号を半角英数記号へ
# : 'han2zen' = 7.半角カタカナ英数記号を全角へ
# : 'zen2han' = 8.全角仮名文字英数記号を半角へ
# : 'kata2hira' = 9.全角カタカナを全角ひらがなへ
# : 'hira2kata' =10.全角ひらがなを全角カタカナへ
# : 'kana2han' =11.全角平片仮名を半角カタカナへ
# : 'num2zen' =12.半角算用数字を全角算用数字へ
# : 'num2han' =13.全角算用数字を半角算用数字へ
# : 'num2knm' =14.半角算用数字を普通の漢数字へ
# : 'knm2num' =15.普通の漢数字を半角算用数字へ
# : 'num2dai' =16.半角算用数字を大字表記数字へ
# : 'dai2num' =17.大字表記数字を半角算用数字へ
# : 'knm2dai' =18.普通の漢数字を大字表記数字へ
# : 'dai2knm' =19.大字表記数字を普通の漢数字へ
# : ※これ以外の指定は'han2kata'の全角カタカナへとなる
# , yen : 「\」を「¥」(既定値)以外で置替えたい文字列を指定
# : 例: 「\」に置替えなら、yen=u'\'
# : 置替えしないなら、 yen=None とする
# , alt_dic : 置替辞書へmap修正追加するものを辞書で指定
# : 例: 矢印を半角文字で表現, 全角スペースを半角2つに置替え
# : alt_dic={u'⇒':'=>', u' ':' '}
# , del_list : 置替辞書から除去する文字をlistで指定
# , my_dic : 固有の置替辞書を指定
# , pass_list: 置替除外する部分をlistで指定
# , debug) : 0:何もしない(既定値), 1以上:debugの為の情報表示あり
# modeの命名規則 : 全角ひらがな=hira, 全角カタカナ=kata, 半角=han, 全角=zen
# , ' to '='2', 半角英数記号(ascii)=asc, 半角算用数字=num
# , 普通の漢数字=knm, 大字表記数字=dai
# ※ 全て置替用辞書に依存し置替する仕組み。正順一致で置替える
#
# 2.replaces( s : 標準関数replace(s, old, new)の様な文字列sの置替関数
# , alt_dic : 上記のreplace()のoldをnewの対を辞書に指定(複数)
# , pass_list : 変換しない領域の文字列をリスト内に指定
# , mode=None : 必要により、z_conv()のmodeで置替辞書を指定
# , del_list=[]: 置替辞書から除去する文字をlistで指定
# , my_dic={} : 固有の置替辞書を指定
# , yen=u'¥' : 「\」を「¥」(既定値)以外で置替えたい文字列を指定
# , debug=0 ): 0:何もしない(既定値), 1以上:debugの為の情報表示あり
#
# 3.モード別関数(関数名のmodeを既定で指定済, zen_conv()関数の全引数の指定が可能)
# 半角カタカナを全角カタカナへ: han2kata() 全角カタカナを半角カタカナへ: kata2han()
# 半角カタカナを全角ひらがなへ: han2hira() 全角ひらがなを半角カタカナへ: hira2han()
# 半角英数記号を全角英数記号へ: asc2zen() 全角英数記号を半角英数記号へ: zen2asc()
# 半角カタカナ英数記号を全角へ: han2zen() 全角カタカナ英数記号を半角へ: zen2han()
# 全角カタカナを全角ひらがなへ: kata2hira() 全角ひらがなを全角カタカナへ: hira2kata()
# 全角平片仮名を半角カタカナへ: kana2han()
# 半角算用数字を全角算用数字へ: num2zen() 全角算用数字を半角算用数字へ: num2han()
# 半角算用数字を普通の漢数字へ: num2knm() 普通の漢数字を半角算用数字へ: knm2num()
# 半角算用数字を大字表記数字へ: num2dai() 大字表記数字を半角算用数字へ: dai2num()
# 普通の漢数字を大字表記数字へ: knm2dai() 大字表記数字を普通の漢数字へ: dai2knm()
#
# 4.数字文字置替関数
# str2int(s) : 漢数字全角数字含めた数字を整数値化
# all2int(s) : 文字列内の数字を算用数字の整数に置替え

#【更新履歴】
# 2010-05-05 0.0.0  kana2zen()として半角カナを全角のカタカナひらがなへの
# 置替機能及び、そのテストコードを公開
# 2010-05-06 0.0.1  半角への逆置替が欲しくなったので機能拡張し、kana_conv()
# としたdebug時に参照辞書の一部を確認可能にし、指定ミスを
# 発見し易くした長音記号等漏れ等の誤りを補正。多分精度的には
# まだα1クラス。
# 2012-01-13 0.0.1a  通りすがりさんご指摘の'け''ケ'のマッピングミスを修正
# 2012-01-14 0.0.2  この__DOC__のmode名hiraをhan2hiraに変更、その他も改変
# ※0.0.1a以前と非互換。今後は新命名規則でmode名を決定
# 2012-01-15 0.1.0  全角英数記号文字の半角置替をzen2han、その逆をhan2zen
# として追加半角英数記号の全角置替をasc2zen、その逆をzen2asc
# として追加し、関数名をzen_conv()に変更
# 2012-01-16 0.1.0a  引数 yen, alt_dic, del_list, my_dic を追加し個別用途の
# 置替需要に応える様に拡張開始
# 2012-01-16 0.1.1  alt_dic で追加したものに濁点半濁点が処理出来ない不具合解消
# 2012-01-19 0.1.2  利用時タイプの冗長性を軽減の為、mode別関数を作成展開
# 2012-01-22 0.1.2a  コード整理に伴なう軽微な修正とclean up
# 2012-01-22 0.2.0  置替え処理を文字列の頭から正順処理する様に修正(100行→40行)
# 置替文字数上限をなくした。逆順処理はコメント化
# 2012-01-23 0.2.1  辞書との比較を頭文字から始まる文字数分の部分文字列に変更により
# 同一頭文字の多キー存在時のループ回数を低減
# 2012-01-23 0.2.2  pass_listでキー文字列と同じ値の辞書要素を登録し一致分は
# 変更しない様にすることで置替除外箇所の指定を可能にし汎用性を向上
# 2012-01-25 0.2.3  置替用辞書として半角数字と全角数字間置替えするものを追加すると共に
# 置替辞書なしを文字列'None'で指定可能にし、単純な文字列置替関数としての
# 用途にも可能なより汎用的仕様に変更
# 2012-01-26 0.2.4 一般受け狙い?(笑)の汎用関数replaces()追加
# 2012-01-28 0.2.5 整数文字列の整数化関数str2int()の追加
# 2012-01-29 0.2.6 文字列内の整数文字列の算用数字化関数all2int()の追加
#
#【判っている課題】
# my_dic: 著者未使用の為、利用の成否は未確認。
# 数字置替系関数は単純な数字文字間の置替えのみサポート。
# 文字列中の小数点付数字は未対応
# clean up不足 sorry
"""

__author__ = "Mire in Japan"
__date__ = "2012-01-26"
__version__ = '0.2.6'
__copyright__ = 'Copyright (c) 2010-2012 Mire'
__license__ = 'GPL'
__url__ = 'http://pythonlife.seesaa.net/article/247825731.htm '

def replaces(s, alt_dic={}, pass_list=[], mode='None', del_list=[], my_dic={}
, yen=u'¥', debug=0):
"""
複数の文字列の置替ペアの辞書指定して、文字列s上の合致部分を置替た文字列を返す関数
replaces( s : 標準関数replace(s, old, new)の様な文字列sの置替関数
, alt_dic : 上記のreplace()のoldをnewの対を辞書に指定(複数)
, pass_list : 変換しない領域の文字列をリスト内に指定
, mode=None : 必要により、z_conv()のmodeで置替辞書を指定
, del_list=[]: 置替辞書から除去する文字をlistで指定
, my_dic={} : 固有の置替辞書を指定
, yen=u'¥' : 「\」を「¥」(既定値)以外で置替えたい文字列を指定
, debug=0 ): 0:何もしない(既定値), 1以上:debugの為の情報表示あり
"""
return zen_conv(s, mode=mode, alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

allknum = u''

def han2kata(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角カタカナを全角カタカナへ"""
return zen_conv(s, mode='han2kata', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def kata2han(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角カタカナを半角カタカナへ"""
return zen_conv(s, mode='kata2han', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def han2hira(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角カタカナを全角ひらがなへ"""
return zen_conv(s, mode='han2hira', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def hira2han(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角ひらがなを半角カタカナへ"""
return zen_conv(s, mode='hira2han', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def asc2zen(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角英数記号を全角英数記号へ"""
return zen_conv(s, mode='asc2zen', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def zen2asc(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角英数記号を半角英数記号へ"""
return zen_conv(s, mode='zen2asc', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def han2zen(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角カタカナ英数記号を全角へ"""
return zen_conv(s, mode='han2zen', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def zen2han(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角仮名文字英数記号を半角へ"""
return zen_conv(s, mode='zen2han', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def kata2hira(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角カタカナを全角ひらがなへ"""
return zen_conv(s, mode='kata2hira', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def hira2kata(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角ひらがなを全角カタカナへ"""
return zen_conv(s, mode='hira2kata', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def kana2han(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角平片仮名を半角カタカナへ"""
return zen_conv(s, mode='kana2han', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def num2zen(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角算用数字を全角算用数字へ"""
return zen_conv(s, mode='num2zen', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def num2han(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""全角算用数字を半角算用数字へ"""
return zen_conv(s, mode='num2han', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def num2knm(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""半角算用数字を普通の漢数字へ"""
return zen_conv(s, mode='num2knm', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def knm2num(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""普通の漢数字を半角算用数字へ"""
return zen_conv(s, mode='knm2num', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def knm2dai(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""普通の漢数字を大字表記数字へ"""
return zen_conv(s, mode='knm2dai', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)
def dai2knm(s, alt_dic={}, del_list=[], yen=u'¥', pass_list=[]
, my_dic={}, debug=0):
"""大字表記数字を普通の漢数字へ"""
return zen_conv(s, mode='dai2knm', alt_dic=alt_dic, del_list=del_list
, pass_list=pass_list, yen=yen, my_dic=my_dic, debug=debug)

def all2int(s, add_chars=u'', del_chars=u''):
"""数を表す全数字を算用数字に置替え"""
from re import compile, findall
all_num = (u'拾百千万億兆京垓予穣溝潤正'
+ u'01234567890123456789〇一二三四五六七八九'
+ u'〇壱弐参零壹貮貳參肆伍陸柒漆質捌玖'
+ u'零壹贰貳叁參肆伍陆陸柒柒漆捌玖')
num_strs = list(set(list(all_num+add_chars)))
for d in del_chars:
num_strs.sremove(d)
num_strs.sort()
#ptrn = u'[%s]+' % (u''.join(num_strs))
are_nums = compile(u'[%s]+' % (u''.join(num_strs)))
nums = are_nums.findall(s)
nums.sort()
nums.reverse()
#print prn_seq(findall(ptrn, s))
pat_dic = {}
for i in nums:
pat_dic[i] = u'%d' % (str2int(i))
return replaces(s, pat_dic)

def str2int(s
, piriod='.' #小数点:[u'.', u'・', u'٫', u'・']
, comma=',' #桁区切:[u',', u'٬', u',', u' ', u'.', u'、']
):
"""
漢数字、全角数字、半角数字文字列の整数化
【仕様】
1. 拾, 百, 千, 万, 億等が数字の頭にあるときは頭の一が省略されたものと看做す
2. 数字でない余計な文字を含まないこと(現在は、含むと単にpassする)
「、・」等をはさんでいる場合の解釈をどうするか詰めてから対処の予定
"""
#千以下の相対位の刻み
kizami_dic = {u'拾':10
, u'百':100, u'陌':100, u'佰':100
, u'千':1000, u'阡':1000, u'仟':1000}
#万以上の絶対位
kurai_dic = { u'万':10000, u'萬':10000
, u'億':100000000
, u'兆':1000000000000
, u'京':10000000000000000
, u'垓':100000000000000000000
, u'予':1000000000000000000000000
, u'穣':10000000000000000000000000000
, u'溝':100000000000000000000000000000000
, u'潤':1000000000000000000000000000000000000
, u'正':10000000000000000000000000000000000000000}
# 10進数の数字0〜9に当たる全文字に対する整数値の辞書
knum_dic = { '0':0, '1':1, '2':2, '3':3, '4':4
, '5':5, '6':6, '7':7, '8':8, '9':9
, u'0':0, u'1':1, u'2':2, u'3':3, u'4':4
, u'5':5, u'6':6, u'7':7, u'8':8, u'9':9
#漢数字
, u'〇':0, u'一':1, u'二':2, u'三':3, u'四':4
, u'五':5, u'六':6, u'七':7, u'八':8, u'九':9
, u'〇':0, u'壱':1, u'弐':2, u'参':3
#日本の旧大字
, u'零':0, u'壹':1, u'貮':2, u'貳':2, u'參':3
, u'肆':4, u'伍':5, u'陸':6, u'柒':7, u'漆':7
, u'質':7, u'捌':8, u'玖':9
#中国の大字
, u'零':0, u'壹':1, u'贰':2, u'貳':2, u'叁':3, u'參':3
, u'肆':4, u'伍':5, u'陆':6, u'陸':6
, u'柒':7, u'柒':7, u'漆':7, u'捌':8, u'玖':9
#アラビア・インド数字
, u'٠':0, u'١':1 , u'٢':2, u'٣':3, u'٤':4
, u'٥':5, u'٦':6 , u'٧':7, u'٨':8, u'٩':9
#タイ数字
, u'๐':0, u'๑':1, u'๒':2, u'๓':3, u'๔':4
, u'๕':5, u'๖':6, u'๗':7, u'๘':8, u'๙':9
}
r = reverse(s) #末尾文字から解釈するので文字列を反転
ketaage = k3 = k4 = 1 #各桁上げ変数を1に初期化
n = 0 #桁刻みの数の計算用
p = '' #次の処理の為一つ前の文字の区分を記録
for i in r: #末尾より一文字ずつ
if i in knum_dic: # 漢数字0〜9なら
if p=='n': # もし、一つ前もそうなら
ketaage *= 10 # kizamiに依存せず一桁上げ
n += (k3 * k4 * ketaage # 拾百千の桁刻みが省かれているものとして
* knum_dic[i]) # 一桁桁上げして加算
else: # でないなら
n += k3 * k4 * knum_dic[i] # 万以上の位と千以下の刻みをかけて加算
p = 'n' # 次の処理の為一つ前が数字文字だったと記録
elif i in kizami_dic: # 千百十の刻みなら
k3 = kizami_dic[i] # 千以下の刻み桁数を代入: 千=1000, 百=100, 拾=10
ketaage = 1 # 漢数字0〜9連続時の桁上げをクリア
p = 'z' # 次の処理の為一つ前が千以下の刻み文字だったと記録
elif i in kurai_dic: # 万以上の絶対位の文字なら
k4 = kurai_dic[i] # 万以上の絶対位の桁数を代入: 万=10000
k3 = 1 # 千以下の刻み桁数をクリア
ketaage = 1 # 漢数字0〜9連続時の桁上げをクリア
p = 'k' # 次の処理の為一つ前が万以上の位文字だったと記録
else: # それ以外は
print i, u':数字外の文字' # 取り敢えず、画面表示してpassしておく …(2)
if p=='z' or p=='k': #最後の未処理分は
n += k3 * k4 # 頭の一が省略されたものと看做し処理 …(1)
return n #結果を返す

def reverse(s):
"""Unicode文字列用の降順並替関数(python2.x系のunicode型にはreverse()メソッドがない)"""
st = list(s) #いきなりlist化
st.reverse()
return u''.join(st)

############## 2012-01-23: 文字列s の頭からの正順処理に変更した為不要に ##############
#def reverse(s):
# """
# Unicode文字列用の降順並替
# """
# st = u'%s' % (s))
# r = []
# for i in st: r.append(i)
# st.reverse()
# rs = u''
# for i in r: rs = rs + i
# return rs
#
#def sort(s):
# """
# Unicode文字列用の昇順並替
# """
# st = u'%s' % (s)
# r = []
# for i in st: r.append(i)
# r.sort()
# rs = u''
# for i in r: rs = rs + i
# return rs
##############################################################################

def zen_conv(s, mode='han2kata', yen=u'¥'
, alt_dic={}, del_list=[]
, my_dic={}, pass_list=[], debug=0):
"""
半角カナの全角カナ置替関数
===================

第一引数 置替
mode(次の変換モードを指定)::

'han2kata' : 1.半角カタカナを全角カタカナへ(既定値)
'kata2han' : 2.全角カタカナを半角カタカナへ
'han2hira' : 3.半角カタカナを全角ひらがなへ
'hira2han' : 4.全角ひらがなを半角カタカナへ
'asc2zen' : 5.半角英数記号を全角英数記号へ
'zen2asc' : 6.全角英数記号を半角英数記号へ
'han2zen' : 7.半角カタカナ英数記号を全角へ
'zen2han' : 8.全角仮名文字英数記号を半角へ
'kata2hira': 9.全角カタカナを全角ひらがなへ
'hira2kata':10.全角ひらがなを全角カタカナへ
'kana2han' :11.全角平片仮名を半角カタカナへ
'num2zen' :12.半角算用数字を全角算用数字へ
'num2han' :13.全角算用数字を半角算用数字へ
'num2knm' :14.半角算用数字を普通の漢数字へ
'knm2num' :15.普通の漢数字を半角算用数字へ
'num2dai' :16.半角算用数字を大字表記数字へ
'dai2num' :17.大字表記数字を半角算用数字へ
'knm2dai' :18.普通の漢数字を大字表記数字へ
'dai2knm' :19.大字表記数字を普通の漢数字へ
[命名規則 :hira=全角ひらがな, kata=全角カタカナ, han=半角, zen=全角
asc=半角英数記号(ascii文字), ' to '='2']

yen('\'を'¥'以外置替る文字を指定)::

u'¥' :'\'を'¥'に置替(既定)
u'\' :'\'を'\'に置替
None :'\'を置替えない


alt_dic={}置替対象文字の対を辞書で指定し置替を追加修正::

alt_dic=
例: {u'→':'->', u'⇒':'=>'}(矢印を半角で表現)
{'/':u'÷'} (数式の除算記号に置替)
{'\\':u'\'} (※yen=u'\'と等価)

del_list(置替対象文字をリスト指定し置替除外)
del_list=
[] :この関数標準の置替辞書をそのまま使う(既定)
例:['+', '-', '*', '/', '=']
pass_list 置替対象としたくない部分をリスト指定し置替除外
pass_list=
[] :文字列s全文に対し置替え処理を行なう
例: [u'こんにちわ', u'さようなら'] 挨拶部分のみ変換から除外
my_dic={} 添付の11種の置替辞書以外の自前置替辞書を指定
"""

## 1.半角カタカナ ⇒ 全角カタカナ 辞書 ##
han2kata = {
u'ア':u'ア', u'イ':u'イ', u'ウ':u'ウ', u'エ':u'エ', u'オ':u'オ'
, u'カ':u'カ', u'キ':u'キ', u'ク':u'ク', u'ケ':u'ケ', u'コ':u'コ'
, u'サ':u'サ', u'シ':u'シ', u'ス':u'ス', u'セ':u'セ', u'ソ':u'ソ'
, u'タ':u'タ', u'チ':u'チ', u'ツ':u'ツ', u'テ':u'テ', u'ト':u'ト'
, u'ナ':u'ナ', u'ニ':u'ニ', u'ヌ':u'ヌ', u'ネ':u'ネ', u'ノ':u'ノ'
, u'ハ':u'ハ', u'ヒ':u'ヒ', u'フ':u'フ', u'ヘ':u'ヘ', u'ホ':u'ホ'
, u'マ':u'マ', u'ミ':u'ミ', u'ム':u'ム', u'メ':u'メ', u'モ':u'モ'
, u'ヤ':u'ヤ', u'ユ':u'ユ', u'ヨ':u'ヨ', u'゚':u'゜', u'゙':u'゛'
, u'ラ':u'ラ', u'リ':u'リ', u'ル':u'ル', u'レ':u'レ', u'ロ':u'ロ'
, u'ワ':u'ワ', u'ン':u'ン', u'「':u'「', u'」':u'」', u'。':u'。'
, u'、':u'、', u'・':u'・', u'ァ':u'ァ', u'ィ':u'ィ', u'ゥ':u'ゥ'
, u'ェ':u'ェ', u'ォ':u'ォ', u'ャ':u'ャ', u'ュ':u'ュ', u'ョ':u'ョ'

, u'ガ':u'ガ', u'ギ':u'ギ', u'グ':u'グ', u'ゲ':u'ゲ', u'ゴ':u'ゴ'
, u'ザ':u'ザ', u'ジ':u'ジ', u'ズ':u'ズ', u'ゼ':u'ゼ', u'ゾ':u'ゾ'
, u'ダ':u'ダ', u'ヂ':u'ヂ', u'ヅ':u'ヅ', u'デ':u'デ', u'ド':u'ド'
, u'バ':u'バ', u'ビ':u'ビ', u'ブ':u'ブ', u'ベ':u'ベ', u'ボ':u'ボ'
, u'パ':u'パ', u'ピ':u'ピ', u'プ':u'プ', u'ペ':u'ペ', u'ポ':u'ポ'
, u'ヴ':u'ヴ'
, u'ヲ' :u'ヲ', u'ー':u'ー'}

## 2.全角カタカナ ⇒ 半角カタカナ 辞書 ##
kata2han = {
u'ア':u'ア', u'イ':u'イ', u'ウ':u'ウ', u'エ':u'エ', u'オ':u'ケ'
, u'カ':u'カ', u'キ':u'キ', u'ク':u'ク', u'ケ':u'ケ', u'コ':u'コ'
, u'サ':u'サ', u'シ':u'シ', u'ス':u'ス', u'セ':u'セ', u'ソ':u'ソ'
, u'タ':u'タ', u'チ':u'チ', u'ツ':u'ツ', u'テ':u'テ', u'ト':u'ト'
, u'ナ':u'ナ', u'ニ':u'ニ', u'ヌ':u'ヌ', u'ネ':u'ネ', u'ノ':u'ノ'
, u'ハ':u'ハ', u'ヒ':u'ヒ', u'フ':u'フ', u'ヘ':u'ヘ', u'ホ':u'ホ'
, u'マ':u'マ', u'ミ':u'ミ', u'ム':u'ム', u'メ':u'メ', u'モ':u'モ'
, u'ヤ':u'ヤ', u'ユ':u'ユ', u'ヨ':u'ヨ', u'゜':u'゚', u'゛':u'゙'
, u'ラ':u'ラ', u'リ':u'リ', u'ル':u'ル', u'レ':u'レ', u'ロ':u'ロ'
, u'ワ':u'ワ', u'ン':u'ン', u'「':u'「', u'」':u'」', u'。':u'。'
, u'、':u'、', u'・':u'・', u'ァ':u'ァ', u'ィ':u'ィ', u'ゥ':u'ゥ'
, u'ェ':u'ェ', u'ォ':u'ォ', u'ャ':u'ャ', u'ュ':u'ュ', u'ョ':u'ョ'

, u'ガ':u'ガ', u'ギ':u'ギ', u'グ':u'グ', u'ゲ':u'ゲ', u'ゴ':u'ゴ'
, u'ザ':u'ザ', u'ジ':u'ジ', u'ズ':u'ズ', u'ゼ':u'ゼ', u'ゾ':u'ゾ'
, u'ダ':u'ダ', u'ヂ':u'ヂ', u'ヅ':u'ヅ', u'デ':u'デ', u'ド':u'ド'
, u'バ':u'バ', u'ビ':u'ビ', u'ブ':u'ブ', u'ベ':u'ベ', u'ボ':u'ボ'
, u'パ':u'バ', u'ピ':u'ピ', u'プ':u'プ', u'ペ':u'ペ', u'ポ':u'ポ'
, u'ヴ':u'ヴ'
, u'ヲ':u'ヲ' , u'ー':u'ー'}

## 3.半角カタカナ ⇒ 全角ひらがな 辞書 ##
han2hira = {
u'ア':u'あ', u'イ':u'い', u'ウ':u'う', u'エ':u'え', u'オ':u'お'
, u'カ':u'か', u'キ':u'き', u'ク':u'く', u'ケ':u'け', u'コ':u'こ'
, u'サ':u'さ', u'シ':u'し', u'ス':u'す', u'セ':u'せ', u'ソ':u'そ'
, u'タ':u'た', u'チ':u'ち', u'ツ':u'つ', u'テ':u'て', u'ト':u'と'
, u'ナ':u'な', u'ニ':u'に', u'ヌ':u'ぬ', u'ネ':u'ね', u'ノ':u'の'
, u'ハ':u'は', u'ヒ':u'ひ', u'フ':u'ふ', u'ヘ':u'へ', u'ホ':u'ほ'
, u'マ':u'ま', u'ミ':u'み', u'ム':u'む', u'メ':u'め', u'モ':u'も'
, u'ヤ':u'や', u'ユ':u'ゆ', u'ヨ':u'よ', u'゚':u'゜', u'゙':u'゛'
, u'ラ':u'ら', u'リ':u'り', u'ル':u'る', u'レ':u'れ', u'ロ':u'ろ'
, u'ワ':u'わ', u'ン':u'ん', u'「':u'「', u'」':u'」', u'。':u'。'
, u'、':u'、', u'・':u'・', u'ァ':u'ぁ', u'ィ':u'ぃ', u'ゥ':u'ぅ'
, u'ェ':u'ぇ', u'ォ':u'ぉ', u'ャ':u'ゃ', u'ュ':u'ゅ', u'ョ':u'ょ'

, u'ガ':u'が', u'ギ':u'ぎ', u'グ':u'ぐ', u'ゲ':u'げ', u'ゴ':u'ご'
, u'ザ':u'ざ', u'ジ':u'じ', u'ズ':u'ず', u'ゼ':u'ぜ', u'ゾ':u'ぞ'
, u'ダ':u'だ', u'ヂ':u'ぢ', u'ヅ':u'づ', u'デ':u'で', u'ド':u'ど'
, u'バ':u'ば', u'ビ':u'び', u'ブ':u'ぶ', u'ベ':u'べ', u'ボ':u'ぼ'
, u'パ':u'ぱ', u'ピ':u'ぴ', u'プ':u'ぷ', u'ペ':u'ぺ', u'ポ':u'ぽ'
, u'ヴ':u'ヴ' #2012-01-19 'ヴ'を見付け追加
, u'ヲ':u'を' , u'ー':u'ー'}

## 4.全角ひらがな ⇒ 半角カタカナ 辞書 ##
hira2han = {
u'あ':u'ア', u'い':u'イ', u'う':u'ウ', u'え':u'エ', u'お':u'オ'
, u'か':u'カ', u'き':u'キ', u'く':u'ク', u'け':u'ケ', u'こ':u'コ'
, u'さ':u'サ', u'し':u'シ', u'す':u'ス', u'せ':u'セ', u'そ':u'ソ'
, u'た':u'タ', u'ち':u'チ', u'つ':u'ツ', u'て':u'テ', u'と':u'ト'
, u'な':u'ナ', u'に':u'ニ', u'ぬ':u'ヌ', u'ね':u'ネ', u'の':u'ノ'
, u'は':u'ハ', u'ひ':u'ヒ', u'ふ':u'フ', u'へ':u'ヘ', u'ほ':u'ホ'
, u'ま':u'マ', u'み':u'ミ', u'む':u'ム', u'め':u'メ', u'も':u'モ'
, u'や':u'ヤ', u'ゆ':u'ユ', u'よ':u'ヨ', u'゜':u'゚', u'゛':u'゙'
, u'ら':u'ラ', u'り':u'リ', u'る':u'ル', u'れ':u'レ', u'ろ':u'ロ'
, u'わ':u'ワ', u'ん':u'ン', u'「':u'「', u'」':u'」', u'。':u'。'
, u'、':u'、', u'・':u'・', u'ぁ':u'ァ', u'ぃ':u'ィ', u'ぅ':u'ゥ'
, u'ぇ':u'ェ', u'ぉ':u'ォ', u'ゃ':u'ャ', u'ゅ':u'ュ', u'ょ':u'ョ'

, u'が':u'ガ', u'ぎ':u'ギ', u'ぐ':u'グ', u'げ':u'ゲ', u'ご':u'ゴ'
, u'ざ':u'ザ', u'じ':u'ジ', u'ず':u'ズ', u'ぜ':u'ゼ', u'ぞ':u'ゾ'
, u'だ':u'ダ', u'ぢ':u'ヂ', u'づ':u'ヅ', u'で':u'デ', u'ど':u'ド'
, u'ば':u'バ', u'び':u'ビ', u'ぶ':u'ブ', u'べ':u'ベ', u'ぼ':u'ボ'
, u'ぱ':u'パ', u'ぴ':u'ピ', u'ぷ':u'プ', u'ぺ':u'ペ', u'ぽ':u'ポ'
, u'ヴ':u'ヴ' #2012-01-19 'ヴ'を見付け追加
, u'を':u'ヲ' , u'ー':u'ー'}

## 5.半角英数記号 ⇒ 全角英数記号 辞書 ##
asc2zen = {'A':u'A', 'B':u'B', 'C':u'C', 'D':u'D', 'E':u'E'
,'F':u'F', 'G':u'G', 'H':u'H', 'I':u'I', 'J':u'J'
,'K':u'K', 'L':u'L', 'M':u'M', 'N':u'N', 'O':u'O'
,'P':u'P', 'Q':u'Q', 'R':u'R', 'S':u'S', 'T':u'T'
,'U':u'U', 'V':u'V', 'W':u'W', 'X':u'X', 'Y':u'Y'
,'Z':u'Z', '!':u'!', '\"':u'”', '#':u'#', '$':u'$'
,'%':u'%', '&':u'&', '\'':u'’', '(':u'(', ')':u')'
,'~':u'〜', '-':u'−', '=':u'=', '^':u'^', '~':u'〜'
,'\\':u'¥', '|':u'|', '@':u'@', '`':u'‘', '[':u'['
,'{':u'{', ';':u';', '+':u'+', ':':u':', '*':u'*'
,']':u']', '}':u'}', ',':u',', '<':u'<', '.':u'.'
,'>':u'>', '/':u'/', '?':u'?', '_':u'_'
,'a':u'a', 'b':u'b', 'c':u'c', 'd':u'd', 'e':u'e'
,'f':u'f', 'g':u'g', 'h':u'h', 'i':u'i', 'j':u'j'
,'k':u'k', 'l':u'l', 'm':u'm', 'n':u'n', 'o':u'o'
,'p':u'p', 'q':u'q', 'r':u'r', 's':u's', 't':u't'
,'u':u'u', 'v':u'v', 'w':u'w', 'x':u'x', 'y':u'y'
,'z':u'z'
, '0':u'0', '1':u'1', '2':u'2', '3':u'3', '4':u'4'
,'5':u'5', '6':u'6', '7':u'7', '8':u'8', '9':u'9'}

## 6.全角英数記号 ⇒ 半角英数記号 辞書 ##
zen2asc = {u'A':'A', u'B':'B', u'C':'C', u'D':'D', u'E':'E'
, u'F':'F', u'G':'G', u'H':'H', u'I':'I', u'J':'J'
, u'K':'K', u'L':'L', u'M':'M', u'N':'N', u'O':'O'
, u'P':'P', u'Q':'Q', u'R':'R', u'S':'S', u'T':'T'
, u'U':'U', u'V':'V', u'W':'W', u'X':'X', u'Y':'Y'
, u'Z':'z', u'!':'!', u'”':'\"', u'#':'#', u'$':'$'
, u'%':'%', u'&':'&', u'’':'\'', u'(':'(', u')':')'
, u'−':'-', u'=':'=', u'^':'^', u'〜':'~', u'¥':'\\'
, u'@':'@', u'‘':'`', u'[':'[', u'{':'{', u';':';'
, u'+':'+', u':':':', u'*':'*', u']':']', u'}':'}'
, u',':',', u'<':'<', u'.':'.', u'>':'>', u'/':'/'
, u'?':'?', u'\':'\\', u'_':'_'

, u'a':'a', u'b':'b', u'c':'c', u'd':'d', u'e':'e'
, u'f':'f', u'g':'g', u'h':'h', u'i':'i', u'j':'j'
, u'k':'k', u'l':'l', u'm':'m', u'n':'n', u'o':'o'
, u'p':'p', u'q':'q', u'r':'r', u's':'s', u't':'t'
, u'u':'u', u'v':'v', u'w':'w', u'x':'x', u'y':'y'
, u'z':'z'
, u'0':'0', u'1':'1', u'2':'2', u'3':'3', u'4':'4'
, u'5':'5', u'6':'6', u'7':'7', u'8':'8', u'9':'9'}

## 7.半角カタカナ英数記号 ⇒ 全角全角 辞書 ##
han2zen = {'A':u'A', 'B':u'B', 'C':u'C', 'D':u'D', 'E':u'E'
,'F':u'F', 'G':u'G', 'H':u'H', 'I':u'I', 'J':u'J'
,'K':u'K', 'L':u'L', 'M':u'M', 'N':u'N', 'O':u'O'
,'P':u'P', 'Q':u'Q', 'R':u'R', 'S':u'S', 'T':u'T'
,'U':u'U', 'V':u'V', 'W':u'W', 'X':u'X', 'Y':u'Y'
,'Z':u'Z', '!':u'!', '\"':u'”', '#':u'#', '$':u'$'
,'%':u'%', '&':u'&', '\'':u'’', '(':u'(', ')':u')'
,'~':u'〜', '-':u'−', '=':u'=', '^':u'^', '~':u'〜'
,'\\':u'¥', '|':u'|', '@':u'@', '`':u'‘', '[':u'['
,'{':u'{', ';':u';', '+':u'+', ':':u':', '*':u'*'
,']':u']', '}':u'}', ',':u',', '<':u'<', '.':u'.'
,'>':u'>', '/':u'/', '?':u'?', '_':u'_'
,'a':u'a', 'b':u'b', 'c':u'c', 'd':u'd', 'e':u'e'
,'f':u'f', 'g':u'g', 'h':u'h', 'i':u'i', 'j':u'j'
,'k':u'k', 'l':u'l', 'm':u'm', 'n':u'n', 'o':u'o'
,'p':u'p', 'q':u'q', 'r':u'r', 's':u's', 't':u't'
,'u':u'u', 'v':u'v', 'w':u'w', 'x':u'x', 'y':u'y'
,'z':u'z'

, '0':u'0', '1':u'1', '2':u'2', '3':u'3', '4':u'4'
,'5':u'5', '6':u'6', '7':u'7', '8':u'8', '9':u'9'
, u'ア':u'ア', u'イ':u'イ', u'ウ':u'ウ', u'エ':u'エ', u'オ':u'オ'
, u'カ':u'カ', u'キ':u'キ', u'ク':u'ク', u'ケ':u'ケ', u'コ':u'コ'
, u'サ':u'サ', u'シ':u'シ', u'ス':u'ス', u'セ':u'セ', u'ソ':u'ソ'
, u'タ':u'タ', u'チ':u'チ', u'ツ':u'ツ', u'テ':u'テ', u'ト':u'ト'
, u'ナ':u'ナ', u'ニ':u'ニ', u'ヌ':u'ヌ', u'ネ':u'ネ', u'ノ':u'ノ'
, u'ハ':u'ハ', u'ヒ':u'ヒ', u'フ':u'フ', u'ヘ':u'ヘ', u'ホ':u'ホ'
, u'マ':u'マ', u'ミ':u'ミ', u'ム':u'ム', u'メ':u'メ', u'モ':u'モ'
, u'ヤ':u'ヤ', u'ユ':u'ユ', u'ヨ':u'ヨ', u'゚':u'゜', u'゙':u'゛'
, u'ラ':u'ラ', u'リ':u'リ', u'ル':u'ル', u'レ':u'レ', u'ロ':u'ロ'
, u'ワ':u'ワ', u'ン':u'ン', u'「':u'「', u'」':u'」', u'。':u'。'
, u'、':u'、', u'・':u'・', u'ァ':u'ァ', u'ィ':u'ィ', u'ゥ':u'ゥ'
, u'ェ':u'ェ', u'ォ':u'ォ', u'ャ':u'ャ', u'ュ':u'ュ', u'ョ':u'ョ'

, u'ガ':u'ガ', u'ギ':u'ギ', u'グ':u'グ', u'ゲ':u'ゲ', u'ゴ':u'ゴ'
, u'ザ':u'ザ', u'ジ':u'ジ', u'ズ':u'ズ', u'ゼ':u'ゼ', u'ゾ':u'ゾ'
, u'ダ':u'ダ', u'ヂ':u'ヂ', u'ヅ':u'ヅ', u'デ':u'デ', u'ド':u'ド'
, u'バ':u'バ', u'ビ':u'ビ', u'ブ':u'ブ', u'ベ':u'ベ', u'ボ':u'ボ'
, u'パ':u'パ', u'ピ':u'ピ', u'プ':u'プ', u'ペ':u'ペ', u'ポ':u'ポ'
, u'ヴ':u'ヴ'
, u'ヲ' :u'ヲ', u'ー':u'ー'}

## 8.全角仮名文字英数記号 ⇒ 半角 辞書 ##
zen2han = {
u'A':'A', u'B':'B', u'C':'C', u'D':'D', u'E':'E'
, u'F':'F', u'G':'G', u'H':'H', u'I':'I', u'J':'J'
, u'K':'K', u'L':'L', u'M':'M', u'N':'N', u'O':'O'
, u'P':'P', u'Q':'Q', u'R':'R', u'S':'S', u'T':'T'
, u'U':'U', u'V':'V', u'W':'W', u'X':'X', u'Y':'Y'
, u'Z':'z', u'!':'!', u'”':'\"', u'#':'#', u'$':'$'
, u'%':'%', u'&':'&', u'’':'\'', u'(':'(', u')':')'
, u'−':'-', u'=':'=', u'^':'^', u'〜':'~', u'¥':'\\'
, u'@':'@', u'‘':'`', u'[':'[', u'{':'{', u';':';'
, u'+':'+', u':':':', u'*':'*', u']':']', u'}':'}'
, u',':',', u'<':'<', u'.':'.', u'>':'>', u'/':'/'
, u'?':'?', u'\':'\\', u'_':'_'
, u'a':'a', u'b':'b', u'c':'c', u'd':'d', u'e':'e'
, u'f':'f', u'g':'g', u'h':'h', u'i':'i', u'j':'j'
, u'k':'k', u'l':'l', u'm':'m', u'n':'n', u'o':'o'
, u'p':'p', u'q':'q', u'r':'r', u's':'s', u't':'t'
, u'u':'u', u'v':'v', u'w':'w', u'x':'x', u'y':'y'
, u'z':'z'
, u'0':'0', u'1':'1', u'2':'2', u'3':'3', u'4':'4'
, u'5':'5', u'6':'6', u'7':'7', u'8':'8', u'9':'9'
, u'ア':u'ア', u'イ':u'イ', u'ウ':u'ウ', u'エ':u'エ', u'オ':u'ケ'
, u'カ':u'カ', u'キ':u'キ', u'ク':u'ク', u'ケ':u'ケ', u'コ':u'コ'
, u'サ':u'サ', u'シ':u'シ', u'ス':u'ス', u'セ':u'セ', u'ソ':u'ソ'
, u'タ':u'タ', u'チ':u'チ', u'ツ':u'ツ', u'テ':u'テ', u'ト':u'ト'
, u'ナ':u'ナ', u'ニ':u'ニ', u'ヌ':u'ヌ', u'ネ':u'ネ', u'ノ':u'ノ'
, u'ハ':u'ハ', u'ヒ':u'ヒ', u'フ':u'フ', u'ヘ':u'ヘ', u'ホ':u'ホ'
, u'マ':u'マ', u'ミ':u'ミ', u'ム':u'ム', u'メ':u'メ', u'モ':u'モ'
, u'ヤ':u'ヤ', u'ユ':u'ユ', u'ヨ':u'ヨ', u'゜':u'゚', u'゛':u'゙'
, u'ラ':u'ラ', u'リ':u'リ', u'ル':u'ル', u'レ':u'レ', u'ロ':u'ロ'
, u'ワ':u'ワ', u'ン':u'ン', u'「':u'「', u'」':u'」', u'。':u'。'
, u'、':u'、', u'・':u'・', u'ァ':u'ァ', u'ィ':u'ィ', u'ゥ':u'ゥ'
, u'ェ':u'ェ', u'ォ':u'ォ', u'ャ':u'ャ', u'ュ':u'ュ', u'ョ':u'ョ'

, u'ガ':u'ガ', u'ギ':u'ギ', u'グ':u'グ', u'ゲ':u'ゲ', u'ゴ':u'ゴ'
, u'ザ':u'ザ', u'ジ':u'ジ', u'ズ':u'ズ', u'ゼ':u'ゼ', u'ゾ':u'ゾ'
, u'ダ':u'ダ', u'ヂ':u'ヂ', u'ヅ':u'ヅ', u'デ':u'デ', u'ド':u'ド'
, u'バ':u'バ', u'ビ':u'ビ', u'ブ':u'ブ', u'ベ':u'ベ', u'ボ':u'ボ'
, u'パ':u'バ', u'ピ':u'ピ', u'プ':u'プ', u'ペ':u'ペ', u'ポ':u'ポ'
, u'ヴ':u'ヴ'
, u'ヲ':u'ヲ'

, u'あ':u'ア', u'い':u'イ', u'う':u'ウ', u'え':u'エ', u'お':u'オ'
, u'か':u'カ', u'き':u'キ', u'く':u'ク', u'け':u'ケ', u'こ':u'コ'
, u'さ':u'サ', u'し':u'シ', u'す':u'ス', u'せ':u'セ', u'そ':u'ソ'
, u'た':u'タ', u'ち':u'チ', u'つ':u'ツ', u'て':u'テ', u'と':u'ト'
, u'な':u'ナ', u'に':u'ニ', u'ぬ':u'ヌ', u'ね':u'ネ', u'の':u'ノ'
, u'は':u'ハ', u'ひ':u'ヒ', u'ふ':u'フ', u'へ':u'ヘ', u'ほ':u'ホ'
, u'ま':u'マ', u'み':u'ミ', u'む':u'ム', u'め':u'メ', u'も':u'モ'
, u'や':u'ヤ', u'ゆ':u'ユ', u'よ':u'ヨ', u'゜':u'゚', u'゛':u'゙'
, u'ら':u'ラ', u'り':u'リ', u'る':u'ル', u'れ':u'レ', u'ろ':u'ロ'
, u'わ':u'ワ', u'ん':u'ン'
, u'、':u'、', u'・':u'・', u'ぁ':u'ァ', u'ぃ':u'ィ', u'ぅ':u'ゥ'
, u'ぇ':u'ェ', u'ぉ':u'ォ', u'ゃ':u'ャ', u'ゅ':u'ュ', u'ょ':u'ョ'

, u'が':u'ガ', u'ぎ':u'ギ', u'ぐ':u'グ', u'げ':u'ゲ', u'ご':u'ゴ'
, u'ざ':u'ザ', u'じ':u'ジ', u'ず':u'ズ', u'ぜ':u'ゼ', u'ぞ':u'ゾ'
, u'だ':u'ダ', u'ぢ':u'ヂ', u'づ':u'ヅ', u'で':u'デ', u'ど':u'ド'
, u'ば':u'バ', u'び':u'ビ', u'ぶ':u'ブ', u'べ':u'ベ', u'ぼ':u'ボ'
, u'ぱ':u'パ', u'ぴ':u'ピ', u'ぷ':u'プ', u'ぺ':u'ペ', u'ぽ':u'ポ'
, u'ヴ':u'ヴ' #2012-01-19 'ヴ'を見付け追加
, u'を':u'ヲ' , u'ー':u'ー'}

## 9.全角カタカナ ⇒ 全角ひらがな 辞書 ##
kata2hira = {
u'ア':u'あ', u'イ':u'い', u'ウ':u'う', u'エ':u'え', u'オ':u'お'
, u'カ':u'か', u'キ':u'き', u'ク':u'く', u'ケ':u'け', u'コ':u'こ'
, u'サ':u'さ', u'シ':u'し', u'ス':u'す', u'セ':u'せ', u'ソ':u'そ'
, u'タ':u'た', u'チ':u'ち', u'ツ':u'つ', u'テ':u'て', u'ト':u'と'
, u'ナ':u'な', u'ニ':u'に', u'ヌ':u'ぬ', u'ネ':u'ね', u'ノ':u'の'
, u'ハ':u'は', u'ヒ':u'ひ', u'フ':u'ふ', u'ヘ':u'へ', u'ホ':u'ほ'
, u'マ':u'ま', u'ミ':u'み', u'ム':u'む', u'メ':u'め', u'モ':u'も'
, u'ヤ':u'や', u'ユ':u'ゆ', u'ヨ':u'よ', u'゜':u'゜', u'゛':u'゛'
, u'ラ':u'ら', u'リ':u'り', u'ル':u'る', u'レ':u'れ', u'ロ':u'ろ'
, u'ワ':u'わ', u'ン':u'ん'
, u'ァ':u'ぁ', u'ィ':u'ぃ', u'ゥ':u'ぅ'
, u'ェ':u'ぇ', u'ォ':u'ぉ', u'ャ':u'ゃ', u'ュ':u'ゅ', u'ョ':u'ょ'

, u'ガ':u'が', u'ギ':u'ぎ', u'グ':u'ぐ', u'ゲ':u'げ', u'ゴ':u'ご'
, u'ザ':u'ざ', u'ジ':u'じ', u'ズ':u'ず', u'ゼ':u'ぜ', u'ゾ':u'ぞ'
, u'ダ':u'だ', u'ヂ':u'ぢ', u'ヅ':u'づ', u'デ':u'で', u'ド':u'ど'
, u'バ':u'ば', u'ビ':u'び', u'ブ':u'ぶ', u'ベ':u'べ', u'ボ':u'ぼ'
, u'パ':u'ぱ', u'ピ':u'ぴ', u'プ':u'ぷ', u'ペ':u'ぺ', u'ポ':u'ぽ'
, u'ヴ':u'ヴ' #2012-01-19 'ヴ'を見付け追加
, u'ヲ':u'を'}

## 10.全角ひらがな ⇒ 全角カタカナ 辞書 ##
hira2kata = {
u'あ':u'ア', u'い':u'イ', u'う':u'ウ', u'え':u'エ', u'お':u'オ'
, u'か':u'カ', u'き':u'キ', u'く':u'ク', u'け':u'ケ', u'こ':u'コ'
, u'さ':u'サ', u'し':u'シ', u'す':u'ス', u'せ':u'セ', u'そ':u'ソ'
, u'た':u'タ', u'ち':u'チ', u'つ':u'ツ', u'て':u'テ', u'と':u'ト'
, u'な':u'ナ', u'に':u'ニ', u'ぬ':u'ヌ', u'ね':u'ネ', u'の':u'ノ'
, u'は':u'ハ', u'ひ':u'ヒ', u'ふ':u'フ', u'へ':u'ヘ', u'ほ':u'ホ'
, u'ま':u'マ', u'み':u'ミ', u'む':u'ム', u'め':u'メ', u'も':u'モ'
, u'や':u'ヤ', u'ゆ':u'ユ', u'よ':u'ヨ', u'゜':u'゜', u'゛':u'゛'
, u'ら':u'ラ', u'り':u'リ', u'る':u'ル', u'れ':u'レ', u'ろ':u'ロ'
, u'わ':u'ワ', u'ん':u'ン' #, u'「':u'「', u'」':u'」', u'。':u'。'
, u'ぁ':u'ァ', u'ぃ':u'ィ', u'ぅ':u'ゥ'
, u'ぇ':u'ェ', u'ぉ':u'ォ', u'ゃ':u'ャ', u'ゅ':u'ュ', u'ょ':u'ョ'

, u'が':u'ガ', u'ぎ':u'ギ', u'ぐ':u'グ', u'げ':u'ゲ', u'ご':u'ゴ'
, u'ざ':u'ザ', u'じ':u'ジ', u'ず':u'ズ', u'ぜ':u'ゼ', u'ぞ':u'ゾ'
, u'だ':u'ダ', u'ぢ':u'ヂ', u'づ':u'ヅ', u'で':u'デ', u'ど':u'ド'
, u'ば':u'バ', u'び':u'ビ', u'ぶ':u'ブ', u'べ':u'ベ', u'ぼ':u'ボ'
, u'ぱ':u'パ', u'ぴ':u'ピ', u'ぷ':u'プ', u'ぺ':u'ペ', u'ぽ':u'ポ'
, u'ヴ':u'ヴ' #2012-01-19 'ヴ'を見付け追加
, u'を':u'ヲ'}

## 11.全角平片仮名 ⇒ 半角カタカナ半角カナ 辞書 ##
kana2han = {
u'ア':u'ア', u'イ':u'イ', u'ウ':u'ウ', u'エ':u'エ', u'オ':u'ケ'
, u'カ':u'カ', u'キ':u'キ', u'ク':u'ク', u'ケ':u'ケ', u'コ':u'コ'
, u'サ':u'サ', u'シ':u'シ', u'ス':u'ス', u'セ':u'セ', u'ソ':u'ソ'
, u'タ':u'タ', u'チ':u'チ', u'ツ':u'ツ', u'テ':u'テ', u'ト':u'ト'
, u'ナ':u'ナ', u'ニ':u'ニ', u'ヌ':u'ヌ', u'ネ':u'ネ', u'ノ':u'ノ'
, u'ハ':u'ハ', u'ヒ':u'ヒ', u'フ':u'フ', u'ヘ':u'ヘ', u'ホ':u'ホ'
, u'マ':u'マ', u'ミ':u'ミ', u'ム':u'ム', u'メ':u'メ', u'モ':u'モ'
, u'ヤ':u'ヤ', u'ユ':u'ユ', u'ヨ':u'ヨ', u'゜':u'゚', u'゛':u'゙'
, u'ラ':u'ラ', u'リ':u'リ', u'ル':u'ル', u'レ':u'レ', u'ロ':u'ロ'
, u'ワ':u'ワ', u'ン':u'ン', u'「':u'「', u'」':u'」', u'。':u'。'
, u'、':u'、', u'・':u'・', u'ァ':u'ァ', u'ィ':u'ィ', u'ゥ':u'ゥ'
, u'ェ':u'ェ', u'ォ':u'ォ', u'ャ':u'ャ', u'ュ':u'ュ', u'ョ':u'ョ'

, u'ガ':u'ガ', u'ギ':u'ギ', u'グ':u'グ', u'ゲ':u'ゲ', u'ゴ':u'ゴ'
, u'ザ':u'ザ', u'ジ':u'ジ', u'ズ':u'ズ', u'ゼ':u'ゼ', u'ゾ':u'ゾ'
, u'ダ':u'ダ', u'ヂ':u'ヂ', u'ヅ':u'ヅ', u'デ':u'デ', u'ド':u'ド'
, u'バ':u'バ', u'ビ':u'ビ', u'ブ':u'ブ', u'ベ':u'ベ', u'ボ':u'ボ'
, u'パ':u'バ', u'ピ':u'ピ', u'プ':u'プ', u'ペ':u'ペ', u'ポ':u'ポ'
, u'ヴ':u'ヴ'
, u'ヲ':u'ヲ'

, u'あ':u'ア', u'い':u'イ', u'う':u'ウ', u'え':u'エ', u'お':u'オ'
, u'か':u'カ', u'き':u'キ', u'く':u'ク', u'け':u'ケ', u'こ':u'コ'
, u'さ':u'サ', u'し':u'シ', u'す':u'ス', u'せ':u'セ', u'そ':u'ソ'
, u'た':u'タ', u'ち':u'チ', u'つ':u'ツ', u'て':u'テ', u'と':u'ト'
, u'な':u'ナ', u'に':u'ニ', u'ぬ':u'ヌ', u'ね':u'ネ', u'の':u'ノ'
, u'は':u'ハ', u'ひ':u'ヒ', u'ふ':u'フ', u'へ':u'ヘ', u'ほ':u'ホ'
, u'ま':u'マ', u'み':u'ミ', u'む':u'ム', u'め':u'メ', u'も':u'モ'
, u'や':u'ヤ', u'ゆ':u'ユ', u'よ':u'ヨ', u'゜':u'゚' , u'゛':u'゙'
, u'ら':u'ラ', u'り':u'リ', u'る':u'ル', u'れ':u'レ', u'ろ':u'ロ'
, u'わ':u'ワ', u'ん':u'ン'
, u'、':u'、', u'・':u'・', u'ぁ':u'ァ', u'ぃ':u'ィ', u'ぅ':u'ゥ'
, u'ぇ':u'ェ', u'ぉ':u'ォ', u'ゃ':u'ャ', u'ゅ':u'ュ', u'ょ':u'ョ'

, u'が':u'ガ', u'ぎ':u'ギ', u'ぐ':u'グ', u'げ':u'ゲ', u'ご':u'ゴ'
, u'ざ':u'ザ', u'じ':u'ジ', u'ず':u'ズ', u'ぜ':u'ゼ', u'ぞ':u'ゾ'
, u'だ':u'ダ', u'ぢ':u'ヂ', u'づ':u'ヅ', u'で':u'デ', u'ど':u'ド'
, u'ば':u'バ', u'び':u'ビ', u'ぶ':u'ブ', u'べ':u'ベ', u'ぼ':u'ボ'
, u'ぱ':u'パ', u'ぴ':u'ピ', u'ぷ':u'プ', u'ぺ':u'ペ', u'ぽ':u'ポ'
, u'ヴ':u'ヴ' #2012-01-19 'ヴ'を見付け追加
, u'を':u'ヲ' , u'ー':u'ー'}

## 12.半角算用数字 ⇒ 全角算用数字 辞書 ##
num2zen = {'0':u'0', '1':u'1', '2':u'2', '3':u'3', '4':u'4'
,'5':u'5', '6':u'6', '7':u'7', '8':u'8', '9':u'9'}
## 13.全角算用数字 ⇒ 半角算用数字 辞書 ##
num2han = {u'0':'0', u'1':'1', u'2':'2', u'3':'3', u'4':'4'
, u'5':'5', u'6':'6', u'7':'7', u'8':'8', u'9':'9'}

## 14.半角算用数字 ⇒ 普通の漢数字 辞書 ##
num2knm = {'0':u'〇', '1':u'一', '2':u'二', '3':u'三', '4':u'四'
, '5':u'五', '6':u'六', '7':u'七', '8':u'八', '9':u'九'}
## 15.普通の漢数字 ⇒ 半角算用数字 辞書 ##
knm2num = {u'〇':'0', u'一':'1', u'二':'2', u'三':'3', u'四':'4'
, u'五':'5', u'六':'6', u'七':'7', u'八':'8', u'九':'9'}

## 16.半角算用数字 ⇒ 大字表記数字 辞書 ##
num2dai = {'0':u'〇', '1':u'壱', '2':u'弐', '3':u'参', '4':u'四'
, '5':u'五', '6':u'六', '7':u'七', '8':u'八', '9':u'九'}
## 17.大字表記数字 ⇒ 半角算用数字 辞書 ##
dai2num = {u'〇':'0', u'壱':'1', u'弐':'2', u'参':'3', u'四':'4'
, u'五':'5', u'六':'6', u'七':'7', u'八':'8', u'九':'9'
#日本の旧大字
, u'零':'0', u'壹':'1', u'貮':'2', u'貳':'2', u'參':'3'
, u'肆':'4', u'伍':'5', u'陸':'6', u'柒':'7', u'漆':'7'
, u'質':'7', u'捌':'8', u'玖':'9'
#中国の大字
, u'零':'0', u'壹':'1', u'贰':'2', u'貳':'2', u'叁':'3'
, u'參':'3', u'肆':'4', u'伍':'5', u'陆':'6', u'陸':'6'
, u'柒':'7', u'柒':'7', u'漆':'7', u'捌':'8', u'玖':'9'}

## 18.普通の漢数字 ⇒ 大字表記数字 辞書 ##
knm2dai = {u'一':u'壱', u'二':u'弐', u'三':u'参', u'十':u'拾'}
## 19.大字表記数字 ⇒ 普通の漢数字 辞書 ##
dai2knm = {u'壱':u'一', u'弐':u'二', u'参':u'三', u'拾':u'十'
#日本の旧大字
, u'零':u'〇', u'壹':u'一', u'貮':u'二', u'貳':u'二', u'參':u'三'
, u'肆':u'四', u'伍':u'五', u'陸':u'六', u'柒':u'七', u'漆':u'七'
, u'質':u'七', u'捌':u'八', u'玖':u'九'
#中国の大字
, u'零':u'〇', u'壹':u'一', u'贰':u'二', u'貳':u'二', u'叁':u'三'
, u'參':u'三', u'肆':u'四', u'伍':u'五', u'陆':u'六', u'陸':u'六'
, u'柒':u'七', u'柒':u'七', u'漆':u'七', u'捌':u'八', u'玖':u'九'}

# if not my_dic=={}: #不要 clean up 2012-01-25
# mode = 'my_dic' #不要 clean up 2012-01-25
# conv_dic={} #不要 clean up 2012-01-25

## ¥(asciiのバックスラッシュを全角の円マーク以外と対応) ##
if yen==None: #Noneの指定なら、処理から除外
if '\\' in han2zen:
del han2zen['\\']
if '\\' in asc2zen:
del asc2zen['\\']
if u'¥' in zen2han:
del zen2han[u'¥']
if u'¥' in zen2asc:
del zen2asc[u'¥']
if u'\' in zen2han:
del zen2han[u'\']
if u'\' in zen2asc:
del zen2asc[u'\']
elif not yen==u'¥': #u'¥'以外の指定なら、それを対象に
han2zen['\\'] = yen
asc2zen['\\'] = yen
han2zen[u'¥'] = yen # 文中のu'¥'も指定文字へ変更
asc2zen[u'¥'] = yen

zen2han[yen] = '\\'
zen2asc[yen] = '\\'

## モード設定により辞書を選択 ##
md = mode.lower() #文字列を小文字でmode判定 2012-01-14
# daku = [u'゛', u'゜', u'゙', u'゚'] #濁点、半濁点リスト # 昇順化で完全不要 clean up
if not my_dic=={}: #my_dic指定時は
conv_dic = my_dic # my_dic指定の辞書を置替辞書に
elif (md == None #99.モードをNoneとすることで空辞書指定を可能に
or md == 'none'):
conv_dic = {}
##############################################################################
# elif md == 'han2kata': # 1.半角カタカナを全角カタカナへ(既定値)
# conv_dic = han2kata
# elif md == 'kata2han': # 2.全角カタカナを半角カタカナへ
# conv_dic = kata2han
# elif md == 'han2hira': # 3.半角カタカナを全角ひらがなへ
# conv_dic = han2hira
# elif md == 'hira2han': # 4.全角ひらがなを半角カタカナへ
# conv_dic = hira2han
# elif md == 'asc2zen': # 5.半角英数記号を全角英数記号へ
# conv_dic = asc2zen
# elif md == 'zen2asc': # 6.全角英数記号を半角英数記号へ
# conv_dic = zen2asc
# elif md == 'han2zen': # 7.半角カタカナ英数記号を全角へ
# conv_dic = han2zen
# elif md == 'zen2han': # 8.全角仮名文字英数記号を半角へ
# conv_dic = zen2han
# elif md == 'kata2hira': # 9.全角カタカナを全角ひらがなへ
# conv_dic = kata2hira
# elif md == 'hira2kata': #10.全角ひらがなを全角カタカナへ
# conv_dic = hira2kata
# elif md == 'kana2han': #11.全角平片仮名を半角カタカナへ
# conv_dic = kana2han
# elif md == 'kana2han': #11.全角平片仮名を半角カタカナへ
# conv_dic = kana2han
########## 指定の置替辞書を示す文字列と同名の変数にeval()で対応 2012-01-25 ##########
else:
#print '####', md
try:
conv_dic = eval(md)
except:
##############################################################################
conv_dic = han2kata # 1.半角カタカナを全角カタカナへ(既定値)

## 辞書の修正 ##
if not alt_dic=={}: #辞書要素があるなら
for key in alt_dic: # それらを置替辞書conv_dicに追加
conv_dic[key] = alt_dic[key]
if not len(del_list)==0: #除外リストに要素があるなら
for del_key in del_list: # それらが
if del_key in conv_dic: # 置替辞書conv_dicにあるなら
del conv_dic[del_key] # 除外

if not len(pass_list)==0: #除外リストに要素があるなら 2012-01-24
for pass_key in pass_list: # それらを置替辞書conv_dicに
conv_dic[pass_key] = pass_key # キーと同じ値で追加


## 文字列の先頭からの処理の為の頭文字別の辞書を作成 ##
key_dic={} #{u'カ':[u'カ', u'カ゛']}の様な辞書を作成
key_len_dic={}
for key in conv_dic:
if key[0] in key_dic:
key_dic[key[0]].append(key)
else:
key_dic[key[0]] = [key]
if key[0] in key_len_dic:
key_len_dic[key[0]].append(len(key))
else:
key_len_dic[key[0]] = [len(key)]
for k in key_dic: #作成した頭文字別のキー辞書の中身を
key_dic[k].sort() # 整列した上で
key_dic[k].reverse() # 逆順に。長いものからcheckする様に
for k in key_len_dic:
key_len_dic[k]=list(set(key_len_dic[k]))
key_len_dic[k].sort()
key_len_dic[k].reverse()

if debug ==11: # 11のときのみ以下のdebug出力
print key_len_dic
## 正順比較での置替文字列の作成 ##
o = u'%s' % (unicode(s)) #
z = u'' #処理文字追記用文字列変数の初期化
end = len(o) #文字列の長さを取得
i = 0 #文字開始位置のアドレス
while i1: # keyの文字列が1字以上なら後置文字有りなので
# suffixes.append(key[1:])# 後置文字をそのリストに追加
# suffixes = set(suffixes)
# daku = suffixes #
# if debug>10:
# print 'DEBUG:conv_dic = %s' % (prn_seq(conv_dic))
# ## debug時の表示 ##
# if debug>0: #debugモードでは
# if suf_len>1:
# print u'2文字より大きい置換文字の定義があります。未対応です。'
# conv_ks = conv_dic.keys() # 指定置替辞書のキーを取得し
# conv_ks.sort() # それを文字コード順に並べ替え
# for i in range(10): # 10個をその順でキーと値を標準出力
# print u'%s ⇒ %s' % (
# conv_ks[20+i] #2012-01-13 uを追加補正
# ,conv_dic[conv_ks[20+i]]),
# print
# if debug==10:
# print u'daku = %s' % (prn_seq(daku))

# ## 置替文字列の作成 ##
#####################################################################
#  全て置替用辞書に依存し置替する仕組み。以下は濁点・半濁点の判別の為、逆順の
# 文字列を使って処理後、再度逆順にする手法を用いていた0.1.2a。
#
# # カナの半角全角置替で注意すべきは濁点/半濁点が1文字として常に独立するかどうだ。
# #その処理をutf-8でコーディングするには、先ず文字列を確実にunicode化し反転させ
# #一文字ずつ取出し、濁点/半濁点が確認されたときには、処理を保留し次の文字が、
# #同じく濁点/半濁点だったら、濁点/半濁点の連続として前の濁点/半濁点の文字を書出し
# #そうでなかったら、前の濁点/半濁点の文字とくっ付けた文字列が置替候補にないかを
# #見て、そうなら、その置替文字を書出し、そうでないなら、前の濁点/半濁点を単独置替した
# #ものを書出し濁点/半濁点でなかった文字の置替文字を書出す。
# #辞書にない文字なら、前が濁点/半濁点なら単独置替で書出しから辞書になかった文字を書出し
# #最後に書き出した文字列を反転し元に戻して値を返す。
# o = reverse(o) # 濁音半濁音処理の為お尻から処理したいので
# # Unicode文字として並びを反転した上で
# z = p = u'' # 処理用文字列初期化(z=置替後文字列)
# for h in o: # 文字列を1文字ずつ取出し
# is_dakus = False
# if debug==10:
# print 'p=\'%s\', h=\'%s\'' % (p, h)
# if h in conv_dic: # それが辞書にある文字で
# if h in daku: # 濁点、半濁点で
# if p in daku: # ひとつ前もそうだったなら
# k = u'%s%s' % (h, p) # 先ずは前のもの(半/濁点)と
# # その文字をくっ付けたものが
# if k in conv_dic: # 置替辞書(alt_dicでの指定分)
# # にあったら
# z += reverse( #
# conv_dic[k]) # その文字に置替し追加
# p = u'' # 使用済ということで濁点としない
# is_dakus = True #
# if p in conv_dic: # 辞書にあるなら
# z += reverse(
# conv_dic[p]) # 前のものを全角の半/濁点に置替し追加
# p = u'%s' % (h)
# else: # 辞書になかったら
# z += p # そのまま追加
# p = u'%s' % (h) # その文字をpで一つ前の文字として記憶
# else: # 濁点、半濁点でなかったら
# k = u'%s%s' % (h, p) # 前のもの(半/濁点)と
# # その文字をくっ付けたものが
# if k in conv_dic: # 濁点、半濁点付の候補であれば
# z += reverse(conv_dic[k])# その文字に置替し追加
# if debug==10:
# print '',
# print k, conv_dic[k]
# else: # そうでないなら、仕方ないので
# z += reverse(conv_dic[p])# 変換後の濁点、半濁点に変換
# z += reverse(conv_dic[h])# 辞書で全角に置替し文字列追加
# p = u'' # 処理済のpの記憶を消去し通常モードに
# else: # 逆にそれが辞書にない文字で
# if h in daku:
# if p in conv_dic:
# z += reverse(conv_dic[p])
# else:
# z += p
# p=u'%s' % (h)
# else:
# if not p == u'': # pに記憶があり
# k = u'%s%s' % (h, p)
# if k in conv_dic: # 濁点、半濁点付の候補であれば
# z += reverse(
# conv_dic[h+p]) # その文字に置替し追加
# p = u''
# else: # そうでないなら、仕方ないので
# z += p
# z += h
# p = u'' # 処理済のpの記憶を消去し通常モードに
# else:
# z += h # そのままの文字を追加
# p = u''
#
# if h in daku and not is_dakus:
# p = u'%s' % (h)
# else:
# p = u''
# return reverse(z) # 作成した文字列を文字単位で反転し
# # その処理後の文字列を返す
##############################################################################


def prn_seq(sequence):
u"""
Python2.x系でlist, tuple, mapといったシーケンス系の型を直接printすると
unocode文字列が16進数表記となってしまい何のことやら読めなくなってしまう。
この関数は、その不便さを解消する為のものである。
 但し、現時点の実装は文字列と数字のみの要素迄。
"""
from types import TupleType, ListType, DictType, StringType, UnicodeType
from types import IntType, LongType, FloatType
fmt_typ_dic = {StringType:u'\'%s\'', UnicodeType:u'u\'%s\''
, IntType:u'%d', LongType:u'%d', FloatType:u'%f'}
fmt_str_dic = {TupleType:u'(%s)', ListType:u'[%s]'
, DictType:u'{%s}', type(set([])):u'[%s]'}
fmt_str = fmt_str_dic[type(sequence)]
l = []
if type(sequence)==DictType:
for s in sequence:
fmt_str= u'%s:%s' % (fmt_typ_dic[type(s)], fmt_typ_dic[type(sequence[s])])
l.append(fmt_str % (s, sequence[s]))
else:
for s in sequence:
l.append(fmt_typ_dic[type(s)] % (s))
return fmt_str_dic[type(sequence)] % (', '.join(l))


def diff(a, b):
u"""行別差分表示関数"""
from difflib import Differ
before = a.splitlines(1)
after = b.splitlines(1)
d = Differ()
p = 0
for s in d.compare(before, after):
if not (s[0]==' ' or s[0]=='?'):
if s[0]=='+': p = 1
else:
if p==1: print #ブロック毎で空白行を作る
p = 0
print s,

def _test(debug=1):
u"""
zen_conv()の処理テスト用関数
"""
test = u"""
全角片仮名:アイウエオ、パピュプョペェポォ、ヴィー
全角平仮名:あいうえお、半 角 片 仮 名:アイウエオ、濁点重複:バ゙ビ゙
濁点平仮名:がぎくげご、濁点半角片仮名:ガギグゲゴ 、ヴィー
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名:パピプペポ
漢数字: 「金一拾二億三千四百五拾六万七千八百九拾円」、〇、廿
大字: 「金壱千万弐千参拾四円」、壹貮參肆伍陸柒捌玖
全角英数記号: 1234567890,abc,ABC,#$%¥ , → ⇒ ÷
半角英数記号: 1234567890, abc, ABC, #$%\\ ,-> => /
"""
print __doc__
print 'orignal text'
print 'testに次の様に文字列を代入し'
print '>>> test=u\"\"\"%s\"\"\"' % (test)
mode_names={ 'han2kata' :u'# 1.半角カナを全角カタカナへ'
, 'kata2han' :u'# 2.全角カタカナを半角カナへ'
, 'han2hira' :u'# 3.半角カタカナを全角ひらがなへ'
, 'hira2han' :u'# 4.全角ひらがなを半角カナへ'

, 'asc2zen' :u'# 5.半角英数記号を全角へ'
, 'zen2asc' :u'# 6.全角英数記号を半角へ'
, 'han2zen' :u'# 7.半角カナ英数記号を全角へ'
, 'zen2han' :u'# 8.全角仮名英数記号を半角へ'

, 'kata2hira':u'# 9.全角カタカナを全角ひらがなへ'
, 'hira2kata':u'#10.全角ひらがなを全角カタカナへ'
, 'kana2han' :u'#11.全角かなを半角カナへ'

, 'num2zen' :u'#12.半角算用数字を全角算用数字へ'
, 'num2han' :u'#13.全角算用数字を半角算用数字へ'
, 'num2knm' :u'#14.半角算用数字を普通の漢数字へ'
, 'knm2num' :u'#15.普通の漢数字を半角算用数字へ'

, 'num2dai' :u'#16.半角算用数字を大字表記数字へ'
, 'dai2num' :u'#17.大字表記数字を半角算用数字へ'

, 'knm2dai' :u'#18.普通の漢数字を大字表記数字へ'
, 'dai2knm' :u'#19.大字表記数字を普通の漢数字へ'
}
modes=[ 'han2kata', 'kata2han', 'han2hira', 'hira2han'
, 'asc2zen', 'zen2asc', 'zen2han', 'han2zen'
, 'kata2hira', 'hira2kata', 'kana2han'
, 'num2zen', 'num2han', 'num2knm', 'knm2num'
, 'num2dai', 'dai2num', 'knm2dai', 'dai2knm'
]
n = 1
#全modeでtest文字列を変換
for m in modes:
print
print u'%3d%sの変換は' % (n, mode_names[m][3:])
print '>>> zen_conv(test, mode=\'%s\', debug=1)' % (m)
diff(test, zen_conv(test, mode=m, debug=1))
n += 1
#英数記号を含むmodeで「¥」を「\」で処理
ascmodes=['zen2han','han2zen', 'asc2zen', 'zen2asc']
for m in ascmodes:
print
print u'%3d%sの変換でyen=u\'\\'とすると' % (n, mode_names[m][3:])
print u'>>> zen_conv(test, mode=\'%s\', yen=u\'\\', debug=1)' % (m)
print zen_conv(test, mode=m, yen=u'\', debug=1)
n += 1
#英数記号を含むmodeで「¥」や「\」の処理を外す
for m in ascmodes:
print
print u'%3d%sの変換でyen=Noneとすると' % (n, mode_names[m][3:])
print u'>>> zen_conv(test, mode=\'%s\', yen=None, debug=1)' % (m)
print zen_conv(test, mode=m, yen=None, debug=1)
n += 1
m = 'kata2han'
print u'%3d%sの変換でdel_list=[u\'パ\', u\'プ\']とすると' % (n, mode_names[m][3:])
print u'>>> zen_conv(test, mode=\'%s\', del_list=[u\'パ\', u\'プ\'], debug=1)' % (m)
print zen_conv(test, mode=m, del_list=[u'パ', u'プ'], debug=1)
n += 1
m = 'kata2han'
print u'%3d%sの変換でalt_dic={u\'パ\':u\'パ\', u\'->\':u\'→\'}, del_list=[u\'パ\', u\'プ\']とすると' % (n, mode_names[m][3:])
print u'>>> zen_conv(test, mode=\'%s\', alt_dic={u\'パ\':u\'パ\', u\'->\':u\'→\'}, del_list=[u\'パ\', u\'プ\'], debug=0)' % (m)
print zen_conv(test, mode=m
, alt_dic={u'->':u'→', u'パ':u'パ'}
, del_list=[u'パ', u'プ']
, debug=0)
n += 1

def _test2():
u"""
モード名関数のテスト用関数
"""
test = u'''半角片仮名 : アカサタナハマヤラワ ガジヅベポ ヴィ
全角片仮名 : アカサタナハマヤラワ ガジヅベポ ヴィ
全角平仮名 : あかさたなはまやらわ がじづべぽ ヴぃ
半角英数記号: 012<-+-*/->
全角英数記号: 012←+−×÷→
'''
print u'''>>> test = u\'\'\'半角片仮名 : アカサタナハマヤラワ ガジヅベポ ヴィ
全角片仮名 : アカサタナハマヤラワ ガジヅベポ ヴィ
全角平仮名 : あかさたなはまやらわ がじづべぽ ヴぃ
半角英数記号: 012<-+-*/->
全角英数記号: 012←+−×÷→
\'\'\''''
print u'\n# 1.半角カタカナを全角カタカナへ'
print '>>> han2kata(test)'
print han2kata(test)
print u'\n# 2.全角カタカナを半角カタカナへ'
print '>>> kata2han(test)'
print kata2han(test)

print u'# 3.半角カタカナを全角ひらがなへ'
print '>>> han2hira(test)'
print han2hira(test)
print u'\n# 4.全角ひらがなを半角カタカナへ'
print '>>> hira2han(test)'
print hira2han(test)

print u'\n# 5.半角英数記号を全角英数記号へ'
print '>>> asc2zen(test)'
print asc2zen(test)
print u'\n# 6.全角英数記号を半角英数記号へ'
print '>>> zen2asc(test)'
print zen2asc(test)

print u'\n# 7.半角カタカナ英数記号を全角へ'
print '>>> han2zen(test)'
print han2zen(test)
print u'\n# 8.全角仮名文字英数記号を半角へ'
print '>>> zen2han(test)'
print zen2han(test)

print u'\n# 9.全角カタカナを全角ひらがなへ'
print '>>> kata2hira(test)'
print kata2hira(test)
print u'\n#10.全角ひらがなを全角カタカナへ'
print '>>> hira2kata(test)'
print hira2kata(test)

print u'\n#11.全角平片仮名を半角カタカナへ'
print '>>> kana2han(test)'
print kana2han(test)

print u'\n#12.半角英数記号を全角へ&演算子矢印置替追加'
print '>>> asc2zen(test, alt_dic={\'+\':u\'+\', \'-\':u\'−\', \'*\':u\'×\', \'/\':u\'÷\', \'<-\':u\'←\', \'->\':u\'→\'})'
print asc2zen(test, alt_dic={'+':u'+', '-':u'−'
, '*':u'×', '/':u'÷'
, '<-':u'←', '->':u'→'}
, debug=1)

print u'\n#13.半角英数記号を全角へ&数字除外'
print '>>> asc2zen(test, alt_dic={\'+\':u\'+\', \'-\':u\'−\', \'*\':u\'×\', \'/\':u\'÷\', \'<-\':u\'←\', \'->\':u\'→\'})'
print asc2zen(test, del_list=['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], debug=1)

print u'\n#13.半角英数記号を全角へ&数字除外'
print '>>> asc2zen(test, alt_dic={\'+\':u\'+\', \'-\':u\'−\', \'*\':u\'×\', \'/\':u\'÷\', \'<-\':u\'←\', \'->\':u\'→\'})'
print asc2zen(test, del_list=['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'], debug=1)

def _test3():
knum = { u'億弐百参万四千':102034000
, u'壱億弐百参万四千':102034000
, u'壱億弐百参万四千五':102034005
, u'一二三四五':12345
, u'一二三四万五千':12345000
, u'一二億三四万五千':1200345000
, u'千':1000}
for i in knum:
ans = str2int(i)
if ans == knum[i]:
r = u'='
else:
r = u'≠'
print u'%14d %s %s' % (ans, r, i)

def _test4():
test = u"""
漢数字: 「金一拾二億三千四百五拾六万七千八百九拾円」、〇、廿
大字: 「金壱千万弐千参拾四円」、壹貮參肆伍陸柒捌玖
全角英数記号: 1234567890,abc,ABC,#$%¥ , → ⇒ ÷
半角英数記号: 1234567890, abc, ABC, #$%\\ ,-> => /
"""
print all2int(test)

if __name__ == '__main__':
#_test()
_test2()
続きを読む
posted by Mire at 14:26 | Comment(1) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年01月17日

【Unicode】PythonでのUnicode下での半角カナと全角かな変換(2)

 2010年05月05日記載の「【Unicode】PythonでのUnicode下での半角カナと全角かな変換」で公開したコードに対し、先日以下の様なコメントを頂いた。

こんにちは。

実際に使わせていただいたものです。お世話になってます。
u'ケ':u'お'
u'ケ' :u'お'
u'お' :u'ケ'←こんな感じで、ケのところが おに変わってしまったりするので、修正された方がいいかと思い、コメントいたしました。
Posted by 通りすがり at 2012年01月05日 19:48


 取り敢えず、ご指摘頂いたところに修正を加えさせて頂いた次第だが、修正後のコードを実行して試みるとエラーが出るのでさらに手直しをして行くと、作成当時の状況を少しずつ思い出したところだ。コードとしては、自己の一つの需要に応える為に作ったものを元に簡単にPythonで半角全角の文字置替えるコーディング方法を提示しておこうとの思いで掲載した程度のもので即座に完成形を提供しようと迄の思いのものではなかった。
 でも、そんな姿勢はオープンソースの視点で言うと互いにソースを公開することで誰かが作ってみんなが自由に活用するというメリットを軽視したものであったと今回改めて反省した次第だ。
 と言うことで、今回、いい加減な状態で中断していた同コードを読み易く見直し、ちゃんと動作する様にすると共に、変換モードを追加させて頂き、ここに公開することにさせて頂いた。

 ただ、残念ながら以前のコードは成り行きで出来上がったものであって、変数や処理記載の順番もいい加減、カプセル化の為のmode名も頭での整理が不充分な内での命名だった為、今回のコードでは改めて命名規則を決めた上で全面的に見直させて頂いた。結果として以前のモード値と今回公開のコード上のモード値に互換が無くなってしまった。もし以前のコードを修正して利用しているものについては、そのまま利用頂き、今回のコードについては新規利用分より活用頂くことを推奨させて頂くことにする。しかし、既に利用中のものを今回のコードに置き替えたいなら次のリストに従いmode値を置き替えると良いだろう。但し、7〜10は新設のモードでありJISコードにあるascii文字と重複する全角の英数記号を変換対象に加えたものである。関数名からするとカテゴリ外の機能を追加したので関数名も zen_conv() に改称させて頂いた。

0.半角カタカナを全角ひらがなへ hira → han2hira
1.全角カタカナを全角ひらがなへ zkata2hira → kata2hira
2.全角ひらがなを全角カタカナへ zhira2kata → hira2kata
3.全角ひらがなを半角カナへ zhira2han → hira2han
4.全角カタカナを半角カナへ zkana2han → kata2han
5.全角平片カナを半角カナへ zkana2han → kana2han
6.半角カタカナを全角カタカナへ (既定値) → han2kata(既定値)
7.全角ひらがな+全角カタカナ+全角英数記号を半角へ → zen2han
8.半角ひらがな+全角カタカナ+全角英数記号を全角へ → han2zen
9.半角英数記号を全角へ → asc2zen
10.全角英数記号を半角へ → zen2asc


 尚、以前のコードについては一部機能していないモードがあるが、今回はその点も新たなモード名で全て機能する様にしたつもりだ。ただ作成にあたってはパターンでコピペして作製しているので不具合を抱えがちである。そこで不充分ながらも文字列testに対し全モードをテストする関数を附記している。実行結果は次の通りだが、これだけで総てのチェックが出来る訳でもないので何か不具合があれば、ご指摘頂けるととても有難い。





[mire@localhost ~]$ python jpcode.py

######################################################################
# 1. reverse(s) : Unicode文字列用の降順並替
# 2. sort(s) : Unicode文字列用の昇順並替
# 3. zen_conv( s : 文字列s内の半角/全角カナASCII文字の変換
# , mode : 'han2hira' = 0.半角カタカナを全角ひらがなへ
# : 'kata2hira' = 1.全角カタカナを全角ひらがなへ
# : 'hira2kata' = 2.全角ひらがなを全角カタカナへ
# : 'hira2han' = 3.全角ひらがなを半角カナへ
# : 'kata2han' = 4.全角カタカナを半角カナへ
# : 'kana2han' = 5.全角平片カナを半角カナへ
# : 'han2kata' = 6.半角カタカナを全角カタカナへ(既定値)
# : 'zen2han' = 7.全角カタカナ+ひらがな+英数記号を半角へ
# : 'han2zen' = 8.半角カタカナ+全角英数記号を全角へ
# : 'asc2zen' = 9.半角英数記号を全角へ
# : 'zen2asc' =10.全角英数記号を半角へ
# , yen : 「\」を「¥」(既定値)以外で変換したい文字列を指定
# , alt_dic : 変換辞書へmap修正追加するものを辞書で指定
# , del_list: 変換辞書から除去する文字をlistで指定
# , my_dic : 固有の変換辞書を指定
# , debug) : 固有の変換辞書を指定
# modeの命名規則 : 全角ひらがな=hira, 全角カタカナ=kata, 半角=han, 全角=zen
# : ' to '='2', 半角英数記号(ascii)=asc
#  全て変換用辞書に依存し変換する仕組み。濁点・半濁点の判別の為、逆順の
# 文字列を使って処理後、再度逆順にする手法を用いている。
#【更新履歴】
# 2010-05-05 0.0.0  kana2zen()として半角カナを全角のカタカナひらがなへの
# 変換機能及び、そのテストコードを公開
# 2010-05-06 0.0.1  半角への逆変換が欲しくなったので機能拡張し、kana_conv()
# としたdebug時に参照辞書の一部を確認可能にし、指定ミスを
# 発見し易くした長音記号等漏れ等の誤りを補正。多分精度的には
# まだα1クラス。
# 2012-01-13 0.0.1a  通りすがりさんご指摘の'け''ケ'のマッピングミスを修正
# 2012-01-14 0.0.2  この__DOC__のmode名hiraをhan2hiraに変更、その他も改変
# ※0.0.1a以前と非互換。今後は新命名規則でmode名を決定
# 2012-01-15 0.1.0  全角英数記号文字の半角変換をzen2han、その逆をhan2zen
# として追加半角英数記号の全角変換をasc2zen、その逆をzen2asc
# として追加し、関数名をzen_conv()に変更
# 2012-01-16 0.1.0a  引数 yen, alt_dic, del_list, my_dic を追加し個別用途の
# 変換需要に応える様に拡張開始
#
#【判っている課題】
# 2012-01-17 alt_dicで追加したものに濁点半濁点がうまく処理出来ない場合がある。
# my_dic 利用の成否は未確認。

orignal text
testに次の様に文字列を代入し
>>> test=u"""
全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\
"""

0.半角カタカナを全角ひらがなへの変換は
>>> zen_conv(test, mode='han2hira', debug=1)
カ ⇒ か ガ ⇒ が キ ⇒ き ギ ⇒ ぎ ク ⇒ く グ ⇒ ぐ ケ ⇒ け ゲ ⇒ げ コ ⇒ こ ゴ ⇒ ご

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名あいうえお、
濁点平仮名:がぎくげご、濁点半角片仮名がぎぐげご
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名ぱぴぷぺぽ
濁点重複:ば゛び゛
ヴィー、う゛ぃー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


1.全角カタカナを全角ひらがなへの変換は
>>> zen_conv(test, mode='kata2hira', debug=1)
コ ⇒ こ ゴ ⇒ ご サ ⇒ さ ザ ⇒ ざ シ ⇒ し ジ ⇒ じ ス ⇒ す ズ ⇒ ず セ ⇒ せ ゼ ⇒ ぜ

全角片仮名:あいうえお、ぱぴゅぷょぺぇぽぉ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
う゛ぃー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


2.全角ひらがなを全角カタカナへの変換は
>>> zen_conv(test, mode='hira2kata', debug=1)
ご ⇒ ゴ さ ⇒ サ ざ ⇒ ザ し ⇒ シ じ ⇒ ジ す ⇒ ス ず ⇒ ズ せ ⇒ セ ぜ ⇒ ゼ そ ⇒ ソ

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:アイウエオ、半角片仮名アイウエオ、
濁点平仮名:ガギクゲゴ、濁点半角片仮名ガギグゲゴ
半濁平仮名:パピプペボ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


3.全角ひらがなを半角カナへの変換は
>>> zen_conv(test, mode='hira2han', debug=1)
け ⇒ ケ げ ⇒ ゲ こ ⇒ コ ご ⇒ ゴ さ ⇒ サ ざ ⇒ ザ し ⇒ シ じ ⇒ ジ す ⇒ ス ず ⇒ ズ

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:アイウエオ、半角片仮名アイウエオ、
濁点平仮名:ガギクゲゴ、濁点半角片仮名ガギグゲゴ
半濁平仮名:パピプペボ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


4.全角カタカナを半角カナへの変換は
>>> zen_conv(test, mode='kata2han', debug=1)
ク ⇒ ク グ ⇒ グ ケ ⇒ ケ ゲ ⇒ ゲ コ ⇒ コ ゴ ⇒ ゴ サ ⇒ サ ザ ⇒ ザ シ ⇒ シ ジ ⇒ ジ

全角片仮名:アイウエケ、バピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


5.全角かなを半角カナへの変換は
>>> zen_conv(test, mode='kana2han', debug=1)
け ⇒ ケ げ ⇒ ゲ こ ⇒ コ ご ⇒ ゴ さ ⇒ サ ざ ⇒ ザ し ⇒ シ じ ⇒ ジ す ⇒ ス ず ⇒ ズ

全角片仮名:アイウエケ、バピュプョペェポォ
全角平仮名:アイウエオ、半角片仮名アイウエオ、
濁点平仮名:ガギクゲゴ、濁点半角片仮名ガギグゲゴ
半濁平仮名:パピプペボ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


6.半角カナを全角カタカナへの変換は
>>> zen_conv(test, mode='han2kata', debug=1)
オ ⇒ オ カ ⇒ カ ガ ⇒ ガ キ ⇒ キ ギ ⇒ ギ ク ⇒ ク グ ⇒ グ ケ ⇒ ケ ゲ ⇒ ゲ コ ⇒ コ

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゛ビ゛
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


7.全角仮名英数記号を半角への変換は
>>> zen_conv(test, mode='zen2han', debug=1)
ぎ ⇒ ギ く ⇒ ク ぐ ⇒ グ け ⇒ ケ げ ⇒ ゲ こ ⇒ コ ご ⇒ ゴ さ ⇒ サ ざ ⇒ ザ し ⇒ シ

全角片仮名:アイウエケ、バピュプョペェポォ
全角平仮名:アイウエオ、半角片仮名アイウエオ、
濁点平仮名:ガギクゲゴ、濁点半角片仮名ガギグゲゴ
半濁平仮名:パピプペボ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%\
半角英数記号: 012,abc,ABC,#$%\


8.半角カナ英数記号を全角への変換は
>>> zen_conv(test, mode='han2zen', debug=1)
5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ = > ⇒ >

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゛ビ゛
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%¥


9.半角英数記号を全角への変換は
>>> zen_conv(test, mode='asc2zen', debug=1)
5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ = > ⇒ >

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%¥


10.全角英数記号を半角への変換は
>>> zen_conv(test, mode='zen2asc', debug=1)
4 ⇒ 4 5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ =

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%\
半角英数記号: 012,abc,ABC,#$%\


11.全角仮名英数記号を半角への変換でyen=u'\'とすると
>>> zen_conv(test, mode='zen2han', yen=u'\', debug=1)
ぎ ⇒ ギ く ⇒ ク ぐ ⇒ グ け ⇒ ケ げ ⇒ ゲ こ ⇒ コ ご ⇒ ゴ さ ⇒ サ ざ ⇒ ザ し ⇒ シ

全角片仮名:アイウエケ、バピュプョペェポォ
全角平仮名:アイウエオ、半角片仮名アイウエオ、
濁点平仮名:ガギクゲゴ、濁点半角片仮名ガギグゲゴ
半濁平仮名:パピプペボ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%\
半角英数記号: 012,abc,ABC,#$%\


12.半角カナ英数記号を全角への変換でyen=u'\'とすると
>>> zen_conv(test, mode='han2zen', yen=u'\', debug=1)
5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ = > ⇒ >

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゛ビ゛
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%\
半角英数記号: 012,abc,ABC,#$%\


13.半角英数記号を全角への変換でyen=u'\'とすると
>>> zen_conv(test, mode='asc2zen', yen=u'\', debug=1)
5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ = > ⇒ >

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%\
半角英数記号: 012,abc,ABC,#$%\


14.全角英数記号を半角への変換でyen=u'\'とすると
>>> zen_conv(test, mode='zen2asc', yen=u'\', debug=1)
4 ⇒ 4 5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ =

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%\
半角英数記号: 012,abc,ABC,#$%\


15.全角仮名英数記号を半角への変換でyen=Noneとすると
>>> zen_conv(test, mode='zen2han', yen=None, debug=1)
ぎ ⇒ ギ く ⇒ ク ぐ ⇒ グ け ⇒ ケ げ ⇒ ゲ こ ⇒ コ ご ⇒ ゴ さ ⇒ サ ざ ⇒ ザ し ⇒ シ

全角片仮名:アイウエケ、バピュプョペェポォ
全角平仮名:アイウエオ、半角片仮名アイウエオ、
濁点平仮名:ガギクゲゴ、濁点半角片仮名ガギグゲゴ
半濁平仮名:パピプペボ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


16.半角カナ英数記号を全角への変換でyen=Noneとすると
>>> zen_conv(test, mode='han2zen', yen=None, debug=1)
5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ = > ⇒ >

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゛ビ゛
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


17.半角英数記号を全角への変換でyen=Noneとすると
>>> zen_conv(test, mode='asc2zen', yen=None, debug=1)
5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ = > ⇒ >

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\


18.全角英数記号を半角への変換でyen=Noneとすると
>>> zen_conv(test, mode='zen2asc', yen=None, debug=1)
4 ⇒ 4 5 ⇒ 5 6 ⇒ 6 7 ⇒ 7 8 ⇒ 8 9 ⇒ 9 : ⇒ : ; ⇒ ; < ⇒ < = ⇒ =

全角片仮名:アイウエオ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\

19.全角カタカナを半角カナへの変換でdel_list=[u'パ', u'プ']とすると
>>> zen_conv(test, mode='kata2han', del_list=[u'パ', u'プ'], debug=1)
ク ⇒ ク グ ⇒ グ ケ ⇒ ケ ゲ ⇒ ゲ コ ⇒ コ ゴ ⇒ ゴ サ ⇒ サ ザ ⇒ ザ シ ⇒ シ ジ ⇒ ジ

全角片仮名:アイウエケ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名ガギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\

20.全角カタカナを半角カナへの変換でalt_dic={u'パ':u'パ', u'プ':u'プ'}, del_list=[u'パ', u'プ']とすると
>>> zen_conv(test, mode='kata2han', alt_dic={u'パ':u'パ', u'プ':u'プ'}, del_list=[u'パ', u'プ'], debug=1)
ク ⇒ ク グ ⇒ グ ケ ⇒ ケ ゲ ⇒ ゲ コ ⇒ コ ゴ ⇒ ゴ サ ⇒ サ ザ ⇒ ザ シ ⇒ シ ジ ⇒ ジ

全角片仮名:アイウエケ、パピュプョペェポォ
全角平仮名:あいうえお、半角片仮名アイウエオ、
濁点平仮名:がぎくげご、濁点半角片仮名がギグゲゴ
半濁平仮名:ぱぴぷぺぼ、半濁半角片仮名パピプペポ
濁点重複:バ゙ビ゙
ヴィー、ヴィー
全角英数記号: 012,abc,ABC,#$%¥
半角英数記号: 012,abc,ABC,#$%\

[mire@localhost ~]$


 ソースコードは以下の通り。処理の基本は1文字ずつ辞書のキーに対する価に基づき置換して行く単純なもので、味噌は、濁点と半濁点の処理の為、unicode文字列を反転して末尾の文字から処理を進め濁点と半濁点に遭遇したら次の文字を見て単独の濁点と半濁点とするか濁点と半濁点付きの文字に置換するかを決めて行く様にする必要があることだ。その詳細は、記述が重複するのでコード内のコメントで確認頂きたい。
続きを読む
タグ:Unicode Python
posted by Mire at 03:03 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年01月08日

【数学】順列出力関数の作成(7)〜下桁の一括処理で高速化

 前稿では、全要素桁数の順列生成時のみの最適化で、大幅な高速化を実現した。今回は、それをさらに一歩進めて残り5桁でその後の全桁の追加をまとめて行なう様にして試た。結果として、メモリ限界の12要素12桁順列の出力でも36分程度で処理出来る様になり、ようやくこの関数も実用可能性が出て来た次第だ。
 発想は前稿のコードがketa==2の時の処理だったものを、さらにketa==5のときに、追加で後の4桁分の順列文字列の生成処理を一括で行なわせるだけではあるが、全順列生成で一番時間のかかる12全要素の桁数の順列で1時間を大きく切ることが出来たことで次稿以降で予定の実用化に向け大きく前進出来たと思っている。
 そんなソースコードは以下の通りだ。

続きを読む
posted by Mire at 19:57 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年01月07日

【数学】順列出力関数の作成(6)〜最終要素確定時処理で高速化

 前稿では、zlib.compress()による文字列圧縮を使うことで、そのままなら処理中に全メモリー空間を超過し (生成文字列12バイト×479001600+11桁迄の参照文字列11バイト×479001600の11,017,036,800バイトを超えるメモリーがreturn前に消費し)OUT OF MEMORY となることを回避したが、予告通りメモリー対策は一先ずこの程度で放置して本稿からは処理速度の改善をしていく。
 本稿での対策は極めてシンプルで限定的なものであるが前稿の12要素12桁順列生成に4時間も費やしていたものを100分程度で生成出来る様にした成果面はとても大きいと思う。実のところ、本稿の改善部分は早々と組み込んでいたのだが、メモリー対策の効果比較面で邪魔になったので、ここ迄省いたコードを示させて頂いた次第だ。
 発想は簡単で残り1桁の要素を埋める作業自体は、その一つ前にまとめて行なっても構わないだろうと言うもので、これにより、最後の479001600回分のループ処理を不要にしただけである。コードは以下の通りだが、同時にここ迄なるとコード自体がかなり混雑して来て本体部分が何処か判り辛くなって来たのでdebug用の画面出力とlogファイル出力を関数の引数次第でif文制御する様に記述し判り易くさせて頂いた。そのソースコードは以下の通りだ。
続きを読む
posted by Mire at 14:39 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2012年01月03日

【数学】順列出力関数の作成(5)〜固定長複数順列のZIP化でメモリー対策

 前稿では複数の順列をtab区切り文字列でまとめてメモリー上に置くことで11要素11桁の全順列を生成する様に出来た。しかし、12要素12桁では正味の順列文字列だけで5,748,019,200バイト(12バイト×12!)も必要な為、当方のPCの様に実メモリー2G、SWAP 4Gというメモリー空間ではまともなやり方では物理的に処理出来る筈もない。本稿では、それを可能にするコードを提示させて頂く。
 対策方法は首記の通り、等幅の順列を区切り文字なしで固定長文字列で扱う仕様にした上でZIP圧縮をかけメモリー上の記録量を削減させることにある。結果として個別の記録文字列の生成には多少時間がかかるが、メモリーへの書込み負荷が減る分早く処理出来るし、12要素12桁の順列処理迄ならメモリー不足も解消した。次回は高速化を課題として取り組む予定である。
続きを読む
posted by Mire at 23:04 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

【数学】順列出力関数の作成(4)〜TAB区切り複数順列でメモリー対策

 全稿迄のコードでは、1つの順列を1つのオブジェクトとしてメモリー上に置く仕組みの為、単純にlistオブジェクト、tupleオブジェクト、文字列オブジェクトの生成インスタンスのメモリー上の大きさの差だけ改善しただけのことである。その結果として中でも効率の良い文字列オブジェクトにしたところで11要素11桁順列の総文字数439,084,800バイトの文字列すらpythonでは処理出来ないとすると、いくらユーザ思考にとって素直なオブジェクトデータ型のみで構成した仕様が原因とあっては寂しい限りである。
 オブジェクト型のインスタンスを保持する場合、オブジェクトの型と記憶場所をデータ本体以外に必要となるので、数が増えれば増える程メモリー効率は悪くなってしまう。PythonにC言語にある様なブリミディブな配列やポインタは存在しないのでそこは工夫が必要になる。そこで前稿迄でPythonの型の中では文字列型がもっともメモリ効率が良かったことは確認出来た訳なので、今回は文字列オブジェクト1つに複数の順列を記録する仕様に変更して試た。
 尚、今回は判り易さを優先し複数の順列をtab文字でjoin()し記録、tab文字でsplit()し復元利用する仕様とした。そのコードと実行結果は以下の通りだが、これだけでは11要素11桁順列迄が限界だった。次稿ではそれをさらに改善する予定である。
続きを読む
posted by Mire at 19:53 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2011年12月31日

【数学】順列出力関数の作成(3)〜文字列化でメモリー対策

 前稿では、個別の順列をlistで生成したものをtuple化することで、メモリー不足から9要素9桁迄だったものを9要素9桁迄実用可能にすることでtuple型の利用の有用性を示すことが出来たのではないかと思う。list型はtuple()関数でtupleに、tuple型はlist()関数でlistにいつでも簡単に変換出来るので、編集不要なシーケンスについては初めからtuple型を利用し、編集が必要に成った段階でlist()関数で変換する様な癖付けが大切だということだ。
 さて、一般のシーケンスの扱いの結論としてはこういうことになる次第だが、順列出力という課題に対しては、出題の要素オブジェクト自体のシーケンスで毎回処理する必然性がないので、本稿では要素数と同じ数の文字に置換して個別の順列をその連続文字列で表現することで、tuple化よりメモリー効率の良いものに順列出力関数を改善して試ようと思う。
 技術的には、処理関数本体での前項でtuple()関数でtuple化していた箇所を文字列の標準メソッドjoin()を使い連続文字列化することと、処理関数に渡す前に各要素に対し1対1で対応する文字に置替えることの発想が出来るならは簡単にコーディング出来る筈である。
 例えば、['Alice', 'Ben', 'Charry']という要素に対する順列を処理する場合には、それ自体の文字列をつないで処理するのではなく、['0', '1', '2']といった1文字を要素とする順列のリストを作成し、「''.join(['2', '1', '0'])」とすることで文字列'210'を順列データとして生成して行くけば良いということである。
 具体的には次の様なコードとなった。
続きを読む
posted by Mire at 03:15 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2011年12月29日

【数学】順列出力関数の作成(2)〜tuple化でメモリー対策

 前稿では、再帰関数で定義した単純な順列出力関数を掲載させて頂いた。本稿では出来るだけ少ない修正で9要素9桁の順列迄しか出来なかった点を改善して試ようと思う。
 当方のPythonコーディングではデータ要素の配列を扱う方法としてはlistを多用することが多い。listオブジェクトなら、append(), remove(), sort(), reverse()等多彩なメソッドが使えてとても使い勝手が良いからである。しかし、今回の順列出力関数の様に大量のlistオブジェクトを含むリストを生成し返す関数の場合の様に実メモリー空間を越えてメモリー消費が膨大に増やしてしまう原因となってしまうことがある。それを小手先で回避するにはtuple化することが考えられる。tupleオブジェクトの場合、一切変更不可のオブジェクトの為使い勝手は悪いものの、その分シンプルな為、メモリー消費が抑えられる様だ。
 本稿のコードでは、オブジェクトの構造は別としても10要素10桁の全順列、3628800個×19バイト以上のデータ実体の収納が必要だが計算してもまだ20倍迄なら大丈夫そうである。そうであればlistで作成している順列の並びをtupleに変更することで僅かでも改善の可能性がある筈なので、その点を変更して試た次第だ。
 変更箇所は極めて少ないが変更後のコードは以下の通りだ。
続きを読む
posted by Mire at 00:06 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2011年12月27日

【数学】順列出力関数の作成(1)〜再帰関数で汎用化

 このBlogの「たけしのコマ大数学科」のお題に対するPythonコードは原則発想が簡単で、あまり試行錯誤せずに素早く完成出来る仕様とする様に心掛けている。従って、これ迄盛んに数字や記号の組合せから作る順列は、その並びの桁数分のループを入れ子で直書きし、順列としては不要な要素重複分もループさせる形式を採らせて頂いた次第だ。そちらの方が実践的だし、何といっても皆様にとって解読し易いからである。
 でも、ここの所似た様な順列問題を続けてコーディングしていて、処理時間の待ちが発生すると、心に引っかっていた「再帰関数で汎用化」という想いが大きくなってしまった。

 ということで結果として作成には結構な時間を要したものの、CPU負荷が少ないかなり軽快なまだ自己満足の域を出ないレベルの試作品ながらも、順列リストの生成の汎用関数を作成出来たので、ここに掲載させて頂く。実用上の課題があるバージョンではあるが一度に全ての実装をすると他人には判り辛いものなので、今回はそのままの掲載とさせて頂いた。

続きを読む
posted by Mire at 03:30 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2011年05月26日

或る無能なPythonistaのJava事始(2) 「やさし Java」の読み方

 1ヵ月程前に学習を始め、ようやく「やさしいJava 第4版 高橋麻奈著」も一通り読み終わった。まだ、ある無能なPythonista君は、行末のセミコロンを付け忘れ、javacに怒られている常態であるは内緒にしおくが、当初の想定通り、Javaの基本構造を理解しただけでは、実際のプログラミングで必要なライブラリを知らないので役立つものは何も書けていない。しかし、手間を省かず、「やさしいJava 第4版 高橋麻奈著」の例題を実際に手打ちし体で覚えたことから、短い単純計算のツール程度であれば作れる程度になったことは成果ではあった。

 最近、2度目に目を通して試ると、このことはまえがきに「プログラミング上達への近道は、実際にプログラムを入力し、実行してみることです。...」とちゃんと書いてあることで普遍的な王道だったという事であろう。mireは、PCがまだマイコンとも呼ばれていた頃の古い人間なのでコンピュータ学習は全て独学しかあり得ない時代からのお付合いなので、逆に、このやり方しか知らない訳なので、自然とそうしたが、なかなかマスター出来ない人の1つの特徴として、この最初のボタンの掛け違いで、労をいとい、ネットから手軽にソースをコピペで持って来て実行し、満足するパターンがある。当方もこのことをしない訳ではないが、あくまで、自分の手打ち分で上手く行かない場合のことだったり、直接課題と関係ない機能をお手軽に移植したい場合にするくらいである。どんな言語でもこれは言えること。
 Javaは学習コースが捨てる程に全国で開催されているから問題になるが、我らがPythonに至ってはないので絶対にこれしかない。なぜ無いかというと日本ではポピュラーでないからだが、他言語に理解のある人なら1週間で独り立ち出来る程度にユーザフレンドリーなので要らないことも事実である。どうでもよいことだろうが、pythonの様なLL系言語では「Hello World!!」は「print "Hello World!!"」の一行を書いて「python ソースコードファイル」で済むが、Javaでは、先ずは@クラスを定義、Aその中にmain()実行メソッドを書いて、Bその中に、「System.out.print("Hello World!!");」と書いて、C実行前には「javac ソースコードファイル」でコンパイルしJVMが解する中間言語形態の「〜.class」ファイルに変換し、Dやっと「java クラス名」で実行出来る訳なので、兎に角、これを空で間違いなく打てなきゃ話にならない。最初は意味何ぞ全く判らなくて良いのだ。意味は空で打てる迄になってから考えれば充分だし、ある程度周囲が見渡せる様になってからしか見えないものもあるので、先ずは、「空で打って実行出来る」ことを第一中継ポイントと考え何度でも手打ちして欲しい。JavaはPythonよりたいへんだが目的があれば愚痴っても仕方がない(笑)。

 尚、コーディングスタイルについては、人それぞれの面もあるが、学習中は次の様な書き方をmireは推奨する。Javaは、開発当時主流だったC言語のコーディング構造をそのまま踏襲した為、行コメントを除き「改行」が文法上無視される代わりに文末に「;(セミコロン)」を置くことに加え、ブロックを明示的に中括弧で囲むことを、コンパイラ側の必要性から生まれた制約をユーザーに強いる言語なので、慣れない間は、視覚的に不具合を見付け易い様にして置く方が断然効率的であるからである。
          HelloWorld.java 


/**
* 初めてのjavaプログラム「ようこそ世界へ!!」
/*
public class HelloWorld
{
public static void main(String[] args)
{
System.out.println("Hello World!!"); // Java.lang.System参照
}
}

  1.  ブロックは階層別にタブ文字で段付けし、その中括弧は独立行に同一シフト量で記載することで、括弧の開閉対応が明確になり、エディタ等開発環境のツールに頼らなくとも自分の目で簡単に対応出来る。あまりいないと思うが、機能のないWindowsのメモ帳で学習する人は必須のことだろう。
  2.  Javaプログラミングには、必ず1つ以上のJavaライブラリを利用している。この「Hello World!!」では「System.out.println()」メソッドがそれである。最初から全てについて調べる必要はないが、「JavaTM 2 Platform Standard Edition 5.0 API 仕様」を眺め、その定義を追って試る努力はして行こう。これで似たものや興味深いものを見つけたら、GoogleやYahooで検索すれば使い方の雰囲気が簡単に判るはずだし、何よりも新たな知識の位置付けが明確になり、覚え易い。無論、深追いし過ぎて、手打ち量が減っては良くないので、判らない間は癖付け程度で大丈夫だ。
  3.  そして調べた気付きは、その行末に行コメントとして「//」の後に記入して保存しておこう。

続きを読む
タグ:java
posted by Mire at 01:51 | Comment(0) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2011年04月25日

Python文字コード作法 〜 FreeMindの吐くHTMLソースを日本語に

 Pythonでも、かつてはOS依存の文字コードでコーディングすることが当り前の時代もあったが、今ではUTF-8で記述することを本則とすることになっている。そして、その入出力ではcodecsモジュール等を使い他の文字コードのデータをUnicode化し、内部処理は全てUnocodeで行なわれる様にする訳だ。その流れでPython3に至っては文字列は全てUTF-8であることが前提となっているが、今回はまだPython2.6のコードである。


 さて、お題の説明からさせて頂くが、FreeMindには、多種の規格の文書ファイルにexportする機能があり、一見すると日本語でも問題なく利用出来る様に作られている。しかし、HTMLの場合、日本語等のマルチバイト文字については、文字そのものでなく、&#123456;の様に10進数の文字番号で埋め込まれており、ソースを覗くと何を書いているのか全く分からないということになる。
 ブラウザで表示すればちゃんと読めるので、通常の利用ではなんら問題ない仕様であるので、文句は言えないが、例えば、 FreeMindでまとめたものをHTMLファイルでexportし、必要な部分のHTMLをソースからコピペで、ブログに貼りつけると言ったことをしたい時には、&#123456;という表記ではどこを取出したらよいのか判り難くく、難しい作業となってしまう。
 そこで、本日は、FreeMind0.9.0でexportしたHTMLファイルをちゃんと日本語に置換する為のフィルタプログラムを作ったと言うことである。

 本音で言うと出来るなら、学習を始めたばっかりのJavaでもやって試たかったのだが、まだまだ、能力不足で文字コードの暴れを補正する方法を知らないので、今回はオハコのPythonのみだ。


 さて、作るに当り、FrrMindの吐くHTMLファイルの特徴を明記しておこう。

  1.  Windows上のFreeMind0.9.0の場合、日本語設定の場合、ファイル自体はShift_JISで作成する様になる様で、恐らくOSの言語に合わせ指定されてしまう様である。
  2.  HTMLのペッダー情報には、そのファイルの文字コードが明記されていない。
  3.  そして、マルチバイト文字については、全て&#123456;形式のUNICODEの文字コードの10進数で表示している


 これを、Pythonで、変換するには、次のことを押さえて置く必要がある。

  1.  OSに依存する既定の文字コードを意識してファイルを読み込んで処理するには、普通のopen()関数でなく、codecsモジュール内のopen関数を使う必要がある。その為には、読込む前に、「from codecs import open」としてopen()をcodecs.open()に置換え、第3引数に読込みファイルの文字コードを文字列名で指定する必要がある。そうすることで、Pythonのソースファイルの文字コードとして指定したものに自動変換されるので、OS依存を解消出来ることになる。pythonの
  2.  さて、その上で、読込んだ文字列データの中から、&#123456;形式のUNICODEの文字コードを抽出し、それに対応する文字のリストを作成する。その為には、やはり正規表現r'&#[0-9]*;'と言うパターンを指定して、モジュール「re」のfindall()で文字列全体を舐め回して抽出、その数字部分をスライス「抽出文字列[2:-1]」して&#と;を除くことで取得、それを int()で整数化し、unichr()に入れれば対応するUnicode文字を取得出来る。そして、それをリスト型でなく辞書型変数に納めれば、同じものは省かれて便利である。
  3.  その置換は、文字列メソッドのreplace()で簡単に済んでしまう
  4.  必要により整形し出力すればよい


 今回の場合ファイル名の指定が面倒だったので、入力ファイル名は、第2パラメータとして指定し、画面出力で逃げることにした。従って利用は「python 〜.py 入力ファイル名 > 出力ファイル名」と入力することになる。続きを読む
タグ:Freemind Python
posted by Mire at 20:26 | Comment(1) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする

2010年06月25日

【Pythonic化】POST METHOD時の情報取得に「リスト内包表記」を使う

 リスト内包表記は、for文によるループ処理をリスト内に記入してしまうという一見トリッキーなPythonの規格である。当方の様に古いpythonユーザの中には、未だに認識が足りず、知ってはいても使わないで済ませてしまう輩が多いと思う。何故かって言うとわざわざ使わなくてもシステム作りに支障はないからである。ところが、「エキスパートPythonプログラミング」を読んでみると、同じ働きをするものをリスト内包表記に変えると処理効率が良い(詳しくは買って読んでくれ^^;;)とのことなので、「そろそろ使って試るか」というのが、本日のお題である。

 この手のものは具体的にメリットのある課題を思いつかないと使おうとしてもなかなか実現しない訳だが、前稿のcgi のpost method時に使えなくなる場合のある「mire.htm.cgi_params()」の代わりとして、先ずは使って試ようと思う。

 具体的に、for文で普通にコーディングすると次の様になる。
import cgi
params = {}
for f in cgi.FieldStorage().value:
params[f.name] = f.value

 これをリスト内包表記にすると、[辞書キー, 値]形式のリストを要素とするリストを辞書化するdict()コンストラクタの助けを借りることで行を2つ削減出来る。
import cgi
params = dict([[f.name, f.value] for f in cgi.FieldStorage().value])

 元々、cgi_params()関数を作成したのは、FieldStorage()メソッドを忘れてしまうことが多かったし、思いだしてもスペルミスしてしくじったりということも少なくなかった経験から、cgi上のパラメータを取得するという目的を達成する関数として名前を決めカプセル化したものなので、何れはその置き位置に関係なく確実に利用出来る様にしてしまうつもりだが、そうなる迄は、このリスト内包表記を利用することも選択肢の一つだろう。

 尚、cgi_params()の引数としてcgi.FieldStorage()を渡す手法も含めて、cgiモジュール関連の処理を含むモジュール読込み以前に置くことで確実にPOST METHODでCGIのパラメータの受信が出来ると思う(あくまで思っているだけ)ので、もし、当方のmire.htmモジュールを盲信して利用した結果、同様にPOST METHODで不具合が発生しているなら、その様に修正して試て欲しい。

 気持ち的には、セキュリティ上params変数で全パラメータを保持する形はとりたくないのだが、致し方ない。続きを読む
posted by Mire at 23:19 | Comment(2) | TrackBack(0) | Pythonプログラミング | このブログの読者になる | 更新情報をチェックする
月額見放題1,000円開始キャンペーンバナー(画像ありver)
紺碧の艦隊 ルパン三世 GREAT CHASE クリックプロモーション
<< 2013年01月 >>
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
カテゴリ
タグクラウド
ファン
利用中のオープンソース
最近のコメント
最近の記事
過去ログ
QRコード
レガシーなアプリはいかが?
Dell 法人のお客様ページ
  • 【法人様向け】デル、お得なキャンペーン情報
  • 法人のお客様向け ストレージソリューション
  • 法人のお客様向け ネットワークソリューション
  • 【SOHO法人様向け】デル・オンライン広告限定ページ
  • デル-個人のお客様ページ
  • 【個人のお客様向け】デル・オンライン広告限定ページ
  • オンライン広告限定キャンペーンページ
  • ソフトウェア&周辺機器 パソコン工房
    ツートップインターネットショップ(twotop.co.jp) マウスコンピューター/G-Tune
  • ×

    この広告は1年以上新しい記事の投稿がないブログに表示されております。