Pythonでできること
python を学ぶべきなのか考えている人のために、私が python を使っている理由と python でできることの具体例について書いてみた。
Contents
<li>
<a href="#Python"><span class="toc_number toc_depth_1">2</span> Pythonでできること</a><ul>
<li>
<a href="#i-2"><span class="toc_number toc_depth_2">2.1</span> コマンド出力結果やログなどの抽出、整形</a>
</li>
<li>
<a href="#CSV__DB"><span class="toc_number toc_depth_2">2.2</span> CSV ファイルの処理 (例えば DB への登録)</a>
</li>
<li>
<a href="#excel"><span class="toc_number toc_depth_2">2.3</span> excel ファイルの操作</a>
</li>
<li>
<a href="#DB"><span class="toc_number toc_depth_2">2.4</span> DBアクセス</a>
</li>
<li>
<a href="#Network"><span class="toc_number toc_depth_2">2.5</span> Network のテストやセキュリティの調査に</a>
</li>
<li>
<a href="#_8211_pexpect"><span class="toc_number toc_depth_2">2.6</span> 対話型ツールの自動化 – pexpect</a>
</li>
<li>
<a href="#i-3"><span class="toc_number toc_depth_2">2.7</span> ドキュメント作成</a>
</li>
<li>
<a href="#WEB-2"><span class="toc_number toc_depth_2">2.8</span> WEB アプリケーション構築</a>
</li>
<li>
<a href="#WEB-3"><span class="toc_number toc_depth_2">2.9</span> WEB からの情報収集</a>
</li>
<li>
<a href="#Windows"><span class="toc_number toc_depth_2">2.10</span> Windows デスクトップアプリケーション</a>
</li>
<li>
<a href="#i-4"><span class="toc_number toc_depth_2">2.11</span> 科学技術計算、データサイエンス(機械学習他)</a>
</li>
<li>
<a href="#Python-2"><span class="toc_number toc_depth_2">2.12</span> Python でできることの具体例</a>
</li>
</ul>
</li>
<li>
<a href="#Python-3"><span class="toc_number toc_depth_1">3</span> Python の学習法</a><ul>
<li>
<a href="#Python-4"><span class="toc_number toc_depth_2">3.1</span> Python のわかりにくかったところ</a><ul>
<li>
<a href="#i-5"><span class="toc_number toc_depth_3">3.1.1</span> リストと辞書</a>
</li>
<li>
<a href="#i-6"><span class="toc_number toc_depth_3">3.1.2</span> ループ</a>
</li>
<li>
<a href="#i-7"><span class="toc_number toc_depth_3">3.1.3</span> 内包表現</a>
</li>
<li>
<a href="#i-8"><span class="toc_number toc_depth_3">3.1.4</span> その他</a>
</li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#Python-5"><span class="toc_number toc_depth_1">4</span> Python は商売になるのか?</a>
</li>
なぜ Python を使うことにしたのか
セキュリティ
私が、とあるセキュリティ企業(残念ながら解散しましたが)で研究開発を行っている時、TCP/UDP(IPv4/v6) のフレームに細工をしてネットワークに送信するテストが必要でC言語や perl を使って作っていました。
結構めんどうで何か良いツールが無いかと思い探していたのですが、scapyという python で書かれたパケット操作ツールがあると知りました。このツールが perl を捨てて python にしよう!と思ったきっかけでした。
scapyはレイヤ(IPヘッダ、TCPヘッダ、ペイロードなど)ごとにデータを加工したり、組み立て直して送信したりもできたので、非常に便利でした。もちろん、ファイルにも出力することができるので、LSI設計用のテストデータを作ったりするのにも使いました。
(冷や汗もんでしたが、何とかチップは完成して、動作はしました。商品化には至りませんでしたが。)
とにかく、リスト操作が非常に簡単、ライブラリが豊富、実行が簡単などといった特徴があったので、C や perl から乗り換えました。
WEB アプリケーション
同時に、ユーザにサービス提供用のWEBサイトやWEBインタフェースをPerlやPHPで作っていたのですが、かなり面倒で、セキュアかつ短納期で作れるものだろうか。。。と議論していました。参考までに、どのようなセキュリティ対策が必要か、ということに関しては、IPAの安全なWEBサイトの作り方が参考になります。
クロスサイトスクリプティング対策、csrf対策、SQL injection対策など、pythonを使った物で調べていたのですが、djangoという WEB アプリケーションフレームワークが良いのではないかと先ほどのセキュリティ企業の創業者は言っていました。
使ってみたのですが、非常に洗練されています。セキュリティ、ORM(Object Relation Mapper)、テンプレートがよく考えられています。
django のセキュリティ機能については security in django をご覧ください。この章を読むだけでも、セキュリティの勉強になります。
django については、別途書こうと思います。
Pythonでできること
自分が使う順に挙げてみます。
コマンド出力結果やログなどの抽出、整形
文字列のパターンマッチングが強力なのでテキスト処理によく使っています。ある文字列のこのパターンの部分だけ取り出して、DB化、もしくは、一覧出力したい、などといったことがある場合に使っています。
- web サーバーのログの、ある特定の IP アドレスにマッチしたものの referer だけを取り出したい
- あるパターンのファイル名を持ったファイルを、別のサーバーにコピーしたい
など
CSV ファイルの処理 (例えば DB への登録)
CSV 形式のファイルを DB 化して検索したい、また、逆に、CSV 化したいといったことは良くあるのではないでしょうか。
CSV ライブラリは標準で付属しています。
excel ファイルの操作
openpyxlを使って excel ファイルから読んだり書いたりできます。
別の記事もご参考に
DBアクセス
DB は、簡単なものならば、標準ライブラリ sqlite3でも良いでしょう。
mysql へのアクセスは Connector/python、Postgres へのアクセスは psycopg などがあります。
Network のテストやセキュリティの調査に
scapy は、レイヤ(IPヘッダ、TCPヘッダ、ペイロードなど)ごとにデータを加工したり、組み立て直して送信したりできるので、非常に便利です。私が python を使おうと思ったきっかけです。
セキュリティの専門家は、canvasを使うかもしれませんが、これは python で作られていて、拡張も python でできたと記憶しています。
対話型ツールの自動化 – pexpect
私は、例えば、常時 ssh 接続しておきたい場合がありますが、よく切れるので再接続させたい、といったケースに使っています。接続する時にパスフレーズを入力させ、切断されたら、再度接続する、といったことに使っています。(常時 ssh でポートフォワードさせるため。)
ドキュメント作成
ファイルは reStructureというマークアップ(マークダウン?)方式で簡単に作成できます。
reStructure形式の良いところは、可読性。そのままのテキストでも読めるし、sphinxなどのプログラムにかければ綺麗にフォーマッティングされ、HTML、PDF、man、epubなどの形式で出力することができます。(PDF出力するにはインストールが難しそう?)
生成したhtmlファイルをWEBサーバに転送すればWEBサイトになります。(WordPress を使うほうが簡単ですが・・・)
WEB アプリケーション構築
WEB フレームワーク djangoを使って WEB サーバを構築することができます。
元々ニュースサイトを簡単に構築するために作られた web application framework。
url のパターンと、そのパターンにマッチした場合に呼び出される python の関数を記述する形で書くことができます。
python で書いたクラスが db と対応づくように考えられていて、クラスのメソッドを呼び出すと db アクセスに自動的に変換されます。sql を書く必要はなく、クラスを書くだけでよい。sql の知識は必要だとは思いますが。
表示は、テンプレート経由で表示されて、そのテンプレートには、python の変数が対応づきます。(当然エスケープされて出力されます。)
その他、主要なセキュリティ対策が内蔵されていて、学習まで若干時間がかかる印象ですが、とてもよいものだと思います。
WEB からの情報収集
requests と beautifulsoup を使って公開している web サイト上のデータを DB 化するなど。いわゆるスクレイピング。
株価、競馬、ロトなどの研究(?)に使えるかも?
Windows デスクトップアプリケーション
Python で書いたアプリケーションは、py2exeで exe ファイルにすることができます。私は、Python 2.7 でしか使ったことがありませんが、Python 3.3 以降でも使えるようです。
科学技術計算、データサイエンス(機械学習他)
Top 15 Python Libraries for Data Science in 2017
Python でできることの具体例
Python の学習法
Python の本を買って勉強するのも良いと思いますが、
Python にはすばらしいチュートリアル があります。
今でも電卓として使っています。
Windowsならば、PythonのWEBサイト
からpythonをダウンロードしてインストールしてスタートメニューから起動、mac/linux ならば、通常インストール済みなので、コマンドラインからpythonと打てば実行できます。
Python のわかりにくかったところ
プログラミング言語を何か触ったことがあれば、Python を使うのは難しくはないと思いますが、あまり馴染のない部分があります。
リストと辞書
C や java など普通は配列があるのですが、python を使い始めた時、どう扱えばいいのか戸惑いました。
配列のような順番に格納するものはリストを、連想配列、ハッシュ、マップなどと言われるタイプのキーワードと値が対応づくものは辞書でデータを保持します。
ループ
範囲を表す range は他のプログラミング言語とは少し違いがあるかもしれません。
for i in range(10):
print(i)
range(10) の結果は、
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
です。
また、リストの要素を順番に処理するのも簡単にできます。
for l in 何かのリスト:
print(l)
内包表現
括弧[] の中に for で書くリスト、そもそも、それを何と呼ぶのか覚えられず、ドキュメントを探すのが非常に大変でした。内包表現(list comprehension)です。
[i*2 for i in range(10)]
のようなものです。
その他
標準ライブラリだけでもかなりの数があるので、探せるようになるまで結構大変でした。
ですが、ライブラリリファレンスがわかりやすく分類されています。
その他のライブラリをインストールするのは、pip コマンドで簡単にインストールできます。
Python は商売になるのか?
私は、親会社が一部上場企業であるとある会社から受託しているのですが、元々はその会社からは、Python がらみで取引することにはなったのですが、今は Python に関する問い合わせはありません。
Python プログラマーの年収云々の記事がありますが、それはそれで調査に基くもので正しいかもしれませんが、全体のパイが大きいのかどうかには疑問があります。ですので鵜呑みにしないように。私の周辺では、php(+javascript)、java(+javascript)、.net、また、関西だからかもしれませんが、組み込み(アセンブラ+C) の案件が多いように思います。
そうは言っても、自分の仕事の効率化のために Python は欠かせないものです。開発時には、データベースや CSV の変換に使ったり、テスト用の WEB サーバを構築しています。また、サーバーの運用のため、AWS で稼動している ec2 インスタンスや WEB アプリケーションを監視するためのスクリプトを提案しています。
応用範囲が広く、Google や Amazon の API にも比較的簡単にアクセスできるので触ってみて損は無いと思います。