ラベル リスト内包表記 の投稿を表示しています。 すべての投稿を表示
ラベル リスト内包表記 の投稿を表示しています。 すべての投稿を表示

2014年3月5日水曜日

コマンドライン1行でpythonのコマンドを実行する方法

これもたまにしか使わないので、書いておかないとよく忘れてしまいます。

linuxなどの端末(terminal)で、スクリプトファイルを作るまでもない些細なことで、
スクリプトなら簡単にできる処理がしたいとします。
且つ、linuxコマンドだけでは複雑すぎて面倒な処理などに、1行スクリプトが効果を発揮します。

例をお見せします。

python -c 'print "\n".join([ "mv %d %d.jpg" % ( i, i ) for i in range(5) ])'

以前紹介したリスト内包表記を使っています。
これを実行すると下のように出力表示されます。

mv 0 0.jpg
mv 1 1.jpg
mv 2 2.jpg
mv 3 3.jpg
mv 4 4.jpg

こうしてコマンド文字列を生成することができます。
文字列がうまくできていることを確認できたら今度は

python -c 'print "\n".join([ "mv %d %d.jpg" % ( i, i ) for i in range(5) ])' | bash

などとして、bashの標準入力に流し、実際に実行できます。
こうしてpythonの機能を使って、効率よく処理できます。
挙げた例でいうと、順番に番号が付けられたファイルをいっぺんに名前を変更するときなどに便利です。


python を-cというオプションで実行するとそのあとの文字列が実行されます。
細かいことはググればヘルプなども出てきます。
実はこれはpearlやrubyなど他のスクリプト言語でも似たようなことが出来ますが、
pythonは文法が少し違うので、慣れが必要です。




2014年2月21日金曜日

擬似unixコマンド1

特に仕事でウィンドウズ使っているとunixコマンドを使いたくなることがあります。

そんなの時のために擬似的に似たような動作をする簡易的なpythonプログラムを作っています。
例えばgrep
第1引数の文字列が含まれている行のみ表示するコマンドです。

grep x file

こんな風に使います。
つまり、この場合fileの中身でxが入っている行のみを表示します。
といってもgrepにはもっといろんな機能が付いていますが、簡易版なので、この機能のみを実装してみます。
pythonで書くとかなり簡単に書けます。


import sys

for line in sys.stdin:
    if sys.argv[1] in line:
        print line.rstrip()


処理が遅いと思うのならばリスト内包表記で

import sys
print '\n'.join( [ line.rstrip()   for line in sys.stdin if sys.argv[1] in line ] )

とか書くと少し処理が速くなります。
これをpgrep.pyとかいう名前で保存し、

pgrep.py import pgrep.py
などとコマンドラインで実行すると
文字列importのある行のみ抜き出して表示されます。
いまは作成したプログラムpgrep.pyに対して処理してみましたが、3番目のファイルはテキストならなんでも構いません。
書式は下のとおりです。

pgrep.py [検索文字列] [対象ファイル名]