Python おもちゃばこ (敬称)

新山が Python を使っていくうえで作りためた 簡単なコマンドやライブラリをまとめています (の、予定)。
Python 関連文書も興味があればご覧ください。

なお、ここで公開しているファイル/文書は特に断りがある場合を除きすべて public domain (一部 MIT/X ライセンス) とします。 新山祐介はこれらのプログラムについていかなる責任も負いません。


ユーティリティ

clitrans.py
C#標準ライブラリのリファレンスマニュアル (XML形式) から、簡単なテキスト形式のファイルを生成します。
sortbydate.py
ファイルを古い順 (あるいは新しい順) にソートして表示します。
vnc2flv
Another screen recorder.
Pyntch
Pythonコードアナライザ。型推論をおこない、起こる可能性のあるエラーを表示します。
tenjiwp.py
点字学習用壁紙をつくるためのスクリプト。要Pygame。完成品はこれ
PDFMiner
純Pythonで書かれた PDFパーザとインタプリタ。PDFの解析とテキスト抽出に。 ほぼ PDF-1.7準拠。日本語縦書きと暗号化に対応。
homesync.py
Rsyncのラッパ。ホームディレクトリの手動ミラーに。
des.py
SSLeay の des.pl を Python に移植したもの。
Shaling
検索機能を統合したメーラ (開発中)。すべての作業をコマンドラインで。
Fooling
Pythonのみで書かれた日本語用の文字列検索フレームワークです。
flv2mp3.py
FLV (Flash Video) ファイルから MP3 音声ファイルを取り出します。
jacus.py
簡単な Jabber クライアント。jabber.py が必要です。
PyVnc2swf
画面録画ツール。VNC のセッションを Macromedia Flash 形式に変換します。要 Pygame。
Webstemmer
Webクローラ 兼 HTMLレイアウト分析ツール。
textcrawler.py (Webstemmer に統合されました)
Webクローラのスケルトン。Gzip圧縮、HTTP persistent接続、robots.txt、クッキーをサポート。
mp3cat.py
簡単な mp3 フレームエディタ。音質を損うことなく MP3 を切り貼りします。
unagi.py
P2P風のシステムモニタ。
s.py
asyncore を用いた簡単なポートフォワーディング。asyncore のサンプルとして、あるいはプロトコルの解析に。
netmonitor.py
Linux 用ネットワークモニタ。ネットワークの流量に応じて、 画面左上のピクセルをチカチカさせます。Python 1.5.2 以上。Tkinter 使用。
html2txt.py (Webstemmer に統合されました)
HTML からテキスト文章をとりだします。JavaScript やスタイルシートは除き、 同じ段落の行はすべて連結して 1行にします。Python 2.0 以上。
pycdb.py
cdb を Python で実装したもの。学習用。
unimap.py
Unicode コード表を EUC で生成。
pyfetchmail.py
指定されたホストから pop3 でメールを取り込み、ホームディレクトリの Maildir に配送します。要 qmail。
watcher.py
GNU Screen を使っているときに、Maildir を見て新着メールがあれば画面下に通知します。 pyfetchmail.py とあわせて使用。
tateiscanna.py
$ ./tateiscanna.py LIST
リニトカ
$ ./tateiscanna.py トントカイモ
SYSTEM
PyOne
Python 用ワンライナー支援スクリプト。
pgrep.py
数十万〜百万の並列なパターンを使用可能な grep です。
makegif.py
ビットマップから透過 GIF を作成します。Python Imaging Library が必要です。
fuser.py
プロセスが開いているファイルをすべて表示します。 Linux 用。

ライブラリ

iters.py
よく使っているジェネレータ操作関連の関数。
romm.py
仮名 ←→ ローマ字変換ライブラリ。訓令式・ヘボン式をどちらもサポート。
chnum.py
漢数字を整数値に変換する関数。(例: 一億五千万150000000)
bidi.py
双方向のファイルオブジェクト。ファイルの末尾から readline できます。
pdfparser.py
アホな PDF パーザ。これはただ PDF を解析するだけで何もしません。 (これはPDFMinerに統合されました)
swfparser.py
Macromedia Flash 形式からテキストを抽出。
encdet.py
漢字コードの自動認識をおこなう、ライブラリというよりは実験スクリプト。
abstfilter.py
抽象フィルタクラス。UNIX のパイプ的なことをオブジェクト間でおこなうための簡単なフレームワークです。 (FIXME: ちゃんと使い方の説明つけること)
pstring.py
自分の出自を覚えている文字列クラスです。各文字がどのファイルの何行何桁目から来たかを 記憶しており、一部分を切り取っても元の位置を保持しつづけます。
regpat.py
文字列以外の一般的なシーケンスを正規表現で検索します。 各要素のマッチングや、マッチした際のアクションを手続きで書けます。 将来的には逆順検索もサポートする予定です。
texparser.py
LaTeX のパーザクラス。sgmllib と同じ感覚で使えるようにしました。
lcs.py
Longest Common Subsequence を求める関数。いわゆる difflib みたいなやつです。
sexpr.py
S式パーザ。ファイルから読みこんだ S式を Python のリストにして返します。
reg.py
re モジュールのラッパ。わざわざ正規表現をコンパイルする必要はありません。

小技・定石

forall (関数 pred が要素 seq のすべてに対して真であるか?):

def forall(pred, seq):  # inefficient
  return reduce(lambda r,x: r and pred(x), seq, True)

exists (要素 seq のうち関数 pred が真を返すものがひとつでもあるか?):

def exists(pred, seq):  # inefficient
  return reduce(lambda r,x: r or pred(x), seq, False)

enumerate, zip を使って複数の配列を対応づける:

一方の配列をみて他方に代入する場合:

for (i,x) in enumerate(seq1):
  if condition(x):
    seq2[i] = x

代入の必要がない場合:

for (x,y) in zip(seq1, seq2):  # itertools could speed it up
  if condition(x,y):
    ...

簡単な集合のあつかい:

同値類をまとめる:

def equivalence(feqv, objs):
  eqs = []
  for x in objs:
    eq1 = [x]
    i = 0
    while i < len(eqs):
      if exists(lambda y:feqv(x,y), eqs[i]):
        eq1.extend(eqs[i])
        del(eqs[i])
      else:
        i += 1
    eqs.append(eq1)
  return eqs

print equivalence(lambda x,y:(x%5)==(y%5), [1,1,2,3,4,5,1,2,3,4,0])
# => [[1,1,1], [2,2], [3,3], [4,4], [0,5]]

行列 (=配列の配列) の転置を得る:

zip を使う。(from 人生の敗北者スレ)

>>> apply(zip, [[1,2], [3,4]])
[(1, 3), (2, 4)]

python -u と同様の効果を起動後に実現する

import sys, os
sys.stdin = os.fdopen(0, "rb", 0)
sys.stdout = os.fdopen(1, "wb", 0)
sys.stderr = os.fdopen(2, "wb", 0)

getopt の使い方パターン

import sys

def main(argv):
  import getopt
  def usage():
    print 'usage: %s [-a] [-b] [-c arg] [-d arg] [file ...]' % argv[0]
    return 100
  try:
    opts, args = getopt.getopt(argv[1:], 'abc:d:')
  except getopt.GetoptError:
    return usage()
  (opta, optb, optc, optd) = (False, False, None, None)
  for (k, v) in opts:
    if k == '-a': opta = True
    elif k == '-b': optb = True
    elif k == '-c': optc = v
    elif k == '-d': optd = v
  doit(args)
  return 0

if __name__ == '__main__': sys.exit(main(sys.argv))

Last Modified: Sat Feb 27 07:52:38 UTC 2010

Yusuke Shinyama