rexxxer
@rexxxer

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Pythonで特定の条件に一致するファイルを取得する方法

Q&A

Closed

解決したいこと

・Pythonを用いて、年や月などの特定の条件を指定し、その検索ワードを名前に含むファイルをフォルダから探し出す方法があるかどうかを知りたいです。(Finderで検索窓にキーワードを打ち込むと、そのキーワードが名前に含まれるファイルが羅列されるが、このようなことをPythonでできるかどうかを知りたい。)

・実際にコーディングしてエラーが発生しているわけではなく、上記の動作を実行できる方法があるかどうか、もしあるなら、どのライブラリを使ってどのように記述したらよさそうかを知りたいです。文章のみで少々見苦しいですが、どうぞよろしくお願いいたします。

現在の状況

・PythonでGmailの自動送信を月に1回行う際に、ファイルを添付したい。現在はスクリプト作成段階で、APIなどの設定はまだ。

・meisaiとネーミングされたフォルダには、
2021年11月分明細.pdf
2021年12月分明細.pdf
2022年1月分明細.pdf
のようにネーミングされたファイルが入っている。

・このようなフォルダから、現在の年と月に一致したファイルを検索し、メールに添付したい。現在の年と月は、datetimeで取得している。現在(投稿日)であれば、検索ワードは「2022」と「1」になる。

・つまり、毎月同じファイルを添付するわけではなく、送信する年と月に一致したファイルを毎回指定したフォルダから取得し、メールに添付したい。

自分で試したこと

Pythonを用いて、指定した条件に一致するファイルを取得する方法として、globやos、reなどが挙げられると思います。
しかし私の知る範囲では、上記3つのライブラリでは検索の際に、拡張子による絞り込みあるいは正規表現による絞り込みまでしか行うことができず、「2022」や「1」のような特定の条件を指定することができないように思います。

環境

Python 3.8.5
macOS Big Sur 11.2.3

0

3Answer

ファイル名がそのような名前で決まっているのであれば、以下のようにファイル名を作成して取得するのはいかがでしょうか?

import datetime
now = datetime.datetime.now()
file_name = f'{now.year}{now.month}月分明細.pdf'
print(file_name)
# 2022年1月分明細.pdf

ファイル名に多少の違い(別拡張子や「明細」以外の文字が入ったファイル名)があるのであれば、osライブラリを利用してフォルダ内のすべてのファイル名を取得したうえで、「2022年1月」という文字列での前方一致や正規表現を利用して一致するファイルを特定していくというような方法も考えられると思います。

1Like

Comments

  1. @rexxxer

    Questioner

    @YottyPGさん。ご回答いただきありがとうございました。
    今後の参考とさせていただきます。

任意の条件のマッチをする場合は、一旦globでリストに落とし込んでリストに特定の文字列を含むか確認するのが良いと思います。

import datetime
import glob

dt_now = datetime.datetime.now()
dt_now_year = str(dt_now.year)
dt_now_month = str(dt_now.month)
match_file_name = []
files = glob.glob('*')  # 調べたいフォルダを指定することもできる
for file_name in files:
    if dt_now_year in file_name and dt_now_month in file_name:
        match_file_name.append(file_name)
print(match_file_name)

こんな感じでどうでしょうか。
参考資料
https://note.nkmk.me/python-list-str-select-replace/
https://note.nkmk.me/python-datetime-now-today/

1Like

Comments

  1. @rexxxer

    Questioner

    @yusuke_s_yusukeさん。ご回答いただきありがとうございました。無事解決しました。
    確かに、いったんリストに落とし込んでから検索をかければよかったですね。
    その発想が出てきていませんでした。

Comments

  1. @rexxxer

    Questioner

    @shohiroseさん。ご回答いただきありがとうございます。
    知らなかったので使い方調べてみますね。

Your answer might help someone💌