techno_memo

個人用の技術メモ。python・ROS・AI系のソフトウェア・ツールなどの情報を記載

ファイル命名規則/更新日/ファイルサイズなどを反映した探索機能

やりたいこと

 ファイル命名規則/更新日/ファイルサイズなどを反映したファイル探索機能を実装したい

  • ファイル命名規則の判定

  • ファイル作成・更新・アクセス日時・ファイルサイズの取得と条件判定

f:id:sd08419ttic:20190307213548p:plain

実装

ファイル命名規則の判定

フォルダ中に存在するファイル名に対して、ユーザーが指定した正規表現パターンにマッチするかを判定する。

正規表現ライブラリreのmatch関数を用いてファイル名を判定する。

    def check_filename_regexp(self,filefullpathlist,pattern=None):
        '''
        ファイル命名規則のチェック (正規表現)
        filefullpathlist:ファイルパスのリスト、pattern:正規表現パターン
        '''
        result_path_list = []

        for pathname in filefullpathlist:
            #ファイル名の抽出
            fname, ext = os.path.splitext( os.path.basename(pathname) )    #ファイル名/拡張子の取得

            if pattern is not None:
                result = re.match(pattern,fname)   #re.search:途中も含めた検索、re.match:先頭からの完全一致
            else:
                result = True                       #正規表現パターンを何も設定していないときは元のパスをすべて出力する
            if result:
                result_path_list.append(pathname)
        return result_path_list

よく使いそうなpatternの条件は下記のようなものがある

説明
^XX ファイル先頭がXXから始まる
[0-9]+ ファイル名がすべて数字
.*0 ファイル名に0を含む

その他、使用可能な条件は下記サイトなどが参考となる

qiita.com

ファイル作成・更新・アクセス日時の取得と条件判定

ファイル情報の取得はos.pathで提供される各種関数を使って取得する

datetime形式のファイル作成日時などはstrftimeで文字列変換して表示することができる。

下記にフルパスリストからファイル情報を取得してdataframe形式で保存するスクリプトを示す。

    def get_file_detai_info(self,filefullpathlist):
        '''
        各ファイルの詳細情報(タイムスタンプ、サイズ)情報を取得 (結果をDataFrame形式で返す)
        filefullpathlist:ファイルのフルパスリスト
        '''
        result_df = pd.DataFrame(np.zeros([len(filefullpathlist), 5]), columns=['path', 'create_date', 'access_date','update_date','size'])
        indx_num =0
        for pathname in filefullpathlist:
            #result_df['path'][indx_num] = pathname
            result_df.loc[indx_num,'path'] = pathname

            #作成日時
            create_time = os.path.getctime(pathname)
            create_time_dt = datetime.datetime.fromtimestamp(create_time)
            create_time_str = create_time_dt.strftime('%Y/%m/%d  %H:%M:%S')
            result_df.loc[indx_num,'create_date'] = create_time_str

            #アクセス日時の取得
            acces_time = os.path.getatime(pathname)
            acces_time_dt = datetime.datetime.fromtimestamp(acces_time)
            acces_time_str = acces_time_dt.strftime('%Y/%m/%d  %H:%M:%S')
            result_df.loc[indx_num,'access_date'] = acces_time_str

            #更新日時の取得
            update_time = os.path.getmtime(pathname)
            update_time_dt = datetime.datetime.fromtimestamp(update_time)
            update_time_str = update_time_dt.strftime('%Y/%m/%d  %H:%M:%S')
            result_df.loc[indx_num,'update_date'] = update_time_str

            #サイズの取得 (KB)
            file_size  = os.path.getsize(pathname)
            result_df.loc[indx_num,'size'] = file_size

            #出力結果の表示
            print(create_time_str,acces_time_str,acces_time_str,file_size)
            indx_num = indx_num + 1
        return result_df

日付を条件判定する場合はdatetime形式に変換して比較演算子を利用すると効率が良い

(ユーザーは文字列型のほうが入力しやすいため)

下記にファイル作成日時がユーザーが入力した日付以前か以後かを判定して条件が満たされればそのパスを返す処理を実装する。

    def check_file_create_date(self,filefullpathlist,mode="A", cdate = 0):
        '''
        各ファイルの作成日時が指定した日以前であるかをチェックする
        mode:A (検索日時以降に作成) :B (検索日時以前に作成))、cdate:日時 例:2018/06/06
        '''

        result_path_list = []
        conditon_dt = datetime.datetime.strptime(cdate, '%Y/%m/%d')

        for pathname in filefullpathlist:
            #作成日時
            create_time = os.path.getctime(pathname)
            create_time_dt = datetime.datetime.fromtimestamp(create_time)
            create_time_str = create_time_dt.strftime('%Y/%m/%d  %H:%M:%S')

            if mode == "A":   #ファイル作成日時の比較 (検索条件日時以前に作成)
                if conditon_dt < create_time_dt:
                    result_path_list.append(pathname)
            elif mode == "B": #ファイル作成日時の比較 (検索条件日時以後に作成)
                if conditon_dt > create_time_dt:
                    result_path_list.append(pathname)
        return result_path_list

その他、ファイルサイズ比較などの機能についても1クラスにして下記のように実装した。

github.com

GUIで検索条件を指定できるように作るといろいろな場面で使えるのでtkinterでの条件設定などをする機能を実装していく。