キーワードでファイル検索

投稿者: | 2023-03-27
import PySimpleGUI as sg
from pathlib import Path
import os

title = "ファイルorフォルダ名からキーワード検索"
folder_p = r"C:\Users\~~~~~\Desktop"

def find_word(folder_p, findword, regex, is_file_only):
    """
    ファイ名またはファイルパス全体から文字列を検索する
    
    Para
    ---------------------------------
    folder_p        :str、検索対象のフォルダフルパス
    findword        :str、検索するキーワード
    regex           :str、カレントのみ or サブフォルダを含む
    is_file_only    :boolean、ファイルだけを検索 or フォルダパスも含めて検索
    
    Return
    ---------------------------------
    msg             :str、検索結果
    """
    
    filelist = [str(p) for p in Path(folder_p).glob(regex)]
    filelist = sorted(filelist)
    cnt, msg = 0, ""

    if is_file_only:
        for file_p in filelist:     
            if findword in os.path.basename(file_p):
                cnt += 1
                msg += f'{file_p}\n'
    else:
        for file_p in filelist:    
            if findword in file_p:
                cnt += 1
                msg += f'{file_p}\n'       

    msg = f'ファイル数 = {cnt}\n{msg}'
    return msg

def execute():
    folder_p = values["-Folder_p-"]
    findword = values["-Findword-"]
    regex = '**/*.*'if (values['-Recursive-'] == True) else '*.*'
    is_file_only = values["-Is_file_only-"]
    msg = find_word(folder_p, findword, regex, is_file_only)
    window["text1"].update(msg)


layout = [[sg.Text("読み込みフォルダ", size=(14,1)),
           sg.Input(folder_p, key="-Folder_p-", expand_x=True),sg.FolderBrowse("選択"), sg.B("開く")],
          [sg.Text("検索文字", size=(14,1)), sg.Input("", key="-Findword-", size=(20,1)),
           sg.Checkbox('サブフォルダも検索', default=False, enable_events=True, key='-Recursive-'),
           sg.Checkbox('ファイル名のみ検索', default=True, enable_events=True, key='-Is_file_only-'),
          ],
          [sg.Button("実行", size=(20,1), pad=(5,15), bind_return_key=True)],
          [sg.Multiline(key="text1", size=(60,10), horizontal_scroll=True, expand_x=True, expand_y=True)]]

window = sg.Window(title, layout, font=('Meiryo UI',12), resizable=True)

while True:
    event, values = window.read()
    print(event, values)
    if event == None:
        break
    if event == "実行":
      execute()

window.close()