Python: テキスト処理のためのヘルパー関数
AWKのようなテキスト処理に特化した作業を Python で楽に行うための関数を作った。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Helper function for text stream processing
"""
import sys
def process(function):
paths = (sys.argv + [None])[1:max(2, len(sys.argv))]
for path in paths:
try:
fp = sys.stdin if path is None else open(path)
for line in fp:
function(line.rstrip("\n"))
except (KeyboardInterrupt, EOFError):
pass
except Exception:
exc_type, exc = sys.exc_info()[:2]
print('%s: %s: %s' % (sys.argv[0], exc_type.__name__, exc))
コマンドライン引数が指定されない場合は標準入力から、指定された場合はそれぞれの引数をファイルパスと
見なして全ての入力を順に1行ずつ読み込み、何らかの処理を行う。
process 関数の引数にはパラメータを1個取る関数を渡す。
そのパラメータには、読み込まれた入力が1行ずつ、末尾の改行が除去された文字列として渡される。
利用例
入力をそのまま標準出力へ出力するだけの処理
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import textprocessor
def identity(line):
print(line)
if __name__ == '__main__':
textprocessor.process(identity)
実行例
- 準備したファイル
line1 line2
- 標準入力から流し込む
$ cat ./test.txt | ./identity.py line1 line2
- ファイルパスを指定して実行
$ ./identity.py ./test.txt line1 line2
- 複数のファイルを指定して実行
$ ./identity.py ./test.txt ./test.txt line1 line2 line1 line2
- エラーケース
$ ./identity.py xxxxxx ./identity.py: IOError: [Errno 2] No such file or directory: 'xxxxxx'
0 件のコメント:
コメントを投稿