GoogleColabで自作モジュールを使う&LEET文字列

f:id:monozukuri-bu:20190724214759j:plain

ふっちーです。
今回もPyhonチュートリアルの中で、手間取った部分を書いていきます。

www.oreilly.co.jp

環境

今回もGoogle Colabolatory(Colab)を使用しました。
colab.research.google.com

準備

今回は標準・自作モジュールを使ってみるです。

Colabで自作モジュールを扱うため、ファイルをアップロードします。
今回は以下のコードを用意し、「module2019.py」という名前で保存しました。

# coding: utf-8  
def exchange(word):  
    m = {'A':'4',  'I':'1', 'E':'3', 'T':'7', 'R':'I2', 'M':'AA', 'S':'5' }  
    t = ''.join(m.get(c, c) for c in word)  
    return t  

Colabのサイドメニューからファイルタブを開き、アップロードすれば良いので非常に簡単です。

次にフォルダを作ります。

!mkdir HERO  

これで準備はOKです。

実践

ファイルを複数作る

最初に2つのリストを使ってテキストファイル(.txt)を10個作ります。

#ファイル名
title = [destiny, destroy, death, elemental, masked, vision, extra, contrast, entertainment, evil]  
#本文
main = [DESTINY, DESTROY, DEATH, ELEMENTAL, MASKED, VISION, EXTRA, CONTRAST, ENTERTAINMENT, EVIL]  

for t, m in zip(title, main):  
    with open(f'./HERO/{t}.txt','w') as f:  
        f.write(m)  

writeメソッドはファイルの中に引数の内容をファイルに書きこんでくれます。
さらに、指定したファイル名のファイルが存在しない場合は新しくファイルを作ってくれます。

ファイルを覗く

中身がちゃんと入っているかの確認はしておきたいですね。
でも、1個1個確認するのも面倒ですので、例として先頭が「d」のファイルを確認してみましょう。

今回はglobモジュールを使って確認します。
globは引数にファイルのパスを入力するとそこにあるファイルの名前をリストで返してくれます。
また、ワイルドカード等の特殊文字を使うこともできます。

import glob
l = glob.glob('HERO/[d]*.txt')  
print(l)  
出力結果:  
['HERO/death.txt', 'HERO/destiny.txt', 'HERO/destroy.txt']

頭文字dのファイルを取る事が出来ましたね。
このリストを利用して中身を覗いてみましょう。

for file_name in l:
  with open(file_name) as f:
    s = f.read()
    print(f'{file_name}: {s}')
出力結果:  
HERO/death.txt:DEATH
HERO/destiny.txt:DESTINY
HERO/destroy.txt:DESTROY

それぞれのファイルに対応した本文が書かれていますね。

Leet文字列に書き換え

Leet文字列とは、アルファベットをそれに似ている数字や記号に置き換えたものです。
例:「A」→「4」、「I]→「1」、「R」→「I2」

今回は以下の法則のみを適用します。

変換前 変換後
A 4
E 3
I 1
M AA
R I2
S 5
T 7

ここで、最初に作ったモジュールの出番です。
モジュール名.メソッド名で呼び出すことができます。

ファイルの中身をモジュールのexchangeメソッドに入れていきましょう。

import module2019

Leet_list=[]  
g = glob.glob('HERO/*.txt')  
for file_name in g:  
  with open(file_name) as f:  
    s = f.read()  
    m = module2019.exchange(s)  
    Leet_list.append(m)  
  
print(Leet_list)  
出力結果:  
['D347H', '3N73I2741NAA3N7', 'D3571NY', 'AA45K3D', '3V1L', 'V151ON', 'CON7I2457', '3L3AA3N74L', 'D357I2OY', '3X7I24']  

Leet文字列に置き換わっていますね。

モジュールの中身解説

module2019.pyの中身について解説します。

def exchange(word):
    m = {'A':'4',  'I':'1', 'E':'3', 'T':'7', 'R':'I2', 'M':'AA', 'S':'5' }
    t = ''.join(m.get(c, c) for c in word)
    return t

変数mに今回のLeet文字列に変換する法則が辞書型で格納されています。
ここで.join()の中にあるリスト内包を注目してみましょう。
変数wordに単語を入れて、1文字ずつcに渡しています。

getメソッドは第一引数のcにmと同じキーがあった場合そのバリューを返します。
つまり、cに'A'が入れば'4'を返すという事です。
同じキーが無かった場合は第二引数をそのまま返します。
今回は変換対象ではない文字をそのままcとして返しています。

あとはjoinメソッドが''で1文字ずつ結合して、tに格納してそれを返しています。

'EVIL'で例えると
1. wordに'EVIL'が格納
2. 'E'がcに入り、getメソッドが適用→'3'に変換
3. 'V'はそのまま、'I'が'1'に、'L'もそのまま
4. joinで文字同士を''で結合→'3'+''+'V'+''+'1'+''+'L'のようなイメージで結合
5. tに'3V1L'が入る

まとめ

今回は以下の内容を学習しました。 1. 自作モジュールの使用方法 2. globの使用方法

globの特殊文字は使いこなせると便利そうでした。
もっと深堀りして習得していきたいです。