Python(コマンドラインツール)

複数ファイル横断テキスト検索ツール

# 複数テキストファイルからテキストファイルを検索するスクリプト
import sys
import os

# コマンドライン引数を取得
#for i,v in enumerate(sys.argv):
#    print(i,v)

# 引数の数を確認
# 何もなければ使い方を表示
if len(sys.argv) <= 1:
    print("[USAGE:使用法] findtext(keyword)")
    sys.exit(0) # プログラムを終了

# コマンドライン引数からキーワードを得る
keyword = sys.argv[1]

# カレントディレクトリ以下のファイルをすべて処理する
for root,dirs,files in os.walk("."):  # os.walkでファイルを列挙
    for fi in files:
        result = []
        # テキストファイルを読む
        try:
            path = os.path.join(root,fi) # os.path.joinでフルパスを取得
            with open(path,encoding="utf-8") as f:
                for no,line in enumerate(f):
                    if line.find(keyword) >= 0:
                        line = line.strip() # 各行の空白文字を除去
                        s= "| {0:4}: {1}".format(no+1,line)
                        result.append(s)
        except:
            continue
        # resultに検索結果があれば結果を表示
        if len(result) > 0:
            print("+ file: "+fi)
            for li in result:
                print(li)
Pythonで受け取ったコマンドライン引数はsys.argvに代入されます。 os.walk()メソッドで、指定ディレクトリ以下にあるファイルやフォルダの一覧を取得することができます。 sys.exit()メソッドでプログラムを終了

ファイル名で検索するツール

# ファイル名で検索するツール
import sys
import os
import fnmatch
import datetime
import math

# 引数の確認と使い方を表示
if len(sys.argv) <= 1: 
    print("[USAGE] findfile [--name][--wild][--desc] name")
    sys.exit(0)

# オプションの初期化
search_mode = "name"
search_func = lambda target,name:(target == name)
name = ""
desc_mode = False

# オプションの解析
for v in sys.argv:
    if v == "--name":
        search_mode = "name"
        search_func = lambda target,name:(target == name)
    elif v == "--wild":
        search_mode = "wild"
        search_func = lambda target,pat:fnmatch.fnmatch(target,pat)
    elif v == "--desc":
        desc_mode = True
    else:
        name = v

# オプションの解析結果を表示
print("+ option")
print("| search_mode=",search_mode,name)
print("| desc_mode=",desc_mode)

# ファイルの検索を開始
for root,dirs,files in os.walk("."):
    for fname in files:
        path = os.path.join(root,fname)
        b = search_func(fname,name)
        if b == False:
            continue
        if desc_mode:
            info = os.stat(path)
            kb = math.ceil(info.st_size / 1024)
            mt = datetime.datetime.fromtimestamp(info.st_mtime)
            s = "{0},{1}KB,{2}".format(path,kb,mt.strftime("%Y-%m-%d"))
            print(s)
        else:
            print(path)
fnmatchモジュールfnmatch(target,pat)関数は、第一引数の値が第二引数の値に合致するかを調べて、合致すればTrueを返します。 ファイルサイズ取得処理。.stat().st_sizeでファイルのサイズが取得できます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Python

次の記事

Python(スプリクトのパス)