ローカルにダウンロードしたファイルのパスを条件を指定して絞り込んで取得する
ノンプロ研でPython勉強中です。
定期的に取得したいwebサービスのレポートcsvを指定フォルダにSeleniumでダウンロードするところまでは前回やりました。
無事ダウンロードしたcsvファイルをPythonで読み込ませてpandasで分析して…というのが理想なのですが、pandasスキルが追いつかないのでこのファイルをGoogle ドライブにアップロードして、ここからはスプレッドシートとGASで分析という流れにします。
ダウンロードしたファイルのパスを取得する
まずはローカルにダウンロードしたファイルを扱えないと意味がありません。そこで必要になってくるのがファイルのパスの取得。
ファイルのパスは、ファイルが自分のパソコンのどの場所にあるのかという住所みたいなものと理解しています。
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
download = 'ダウンロード先に指定するフォルダのパス'
options = webdriver.ChromeOptions()
options.add_experimental_option("prefs", {"download.default_directory": download })
driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=options)
前回のコードでダウンロードフォルダのパスはすでにdownloadという変数に格納しています。
download = '/Users/UserNameXXX/Downloads/'
Macだとみたいな例ですね。
ここに、report_2021-08-12.csvみたいな今日の日付の入った定型のファイル名のファイルがダウンロードされるとします。
ここで、パスをオブジェクトとして操作するpathlibというモジュールを使います。
参考にしたのはこちら
import pathlib
import os
import pprint
o_path = pathlib.Path(download)
list_match = list(o_path.glob('report_2021-08-12.csv'))
path = str(list_match[0])
こんな感じでダウンロードしたファイルのパスをゲットしました!
コードの意味を分解していきます
o_path = pathlib.Path(download)
pathlib.Path()でPathオブジェクトを作成しています。引数にファイルパスの文字列を渡しています。
↑これ↑ノンプロ研で講座を受ける前だと一体何を言っているのかわかんなかったと思います。
Pythonは色んなオブジェクトがあって、変数に代入したものがどんなオブジェクトかを意識するのが大事と感じています。
もともと文字列であったファイルパスとPathオブジェクトが別物であることを意識しつつ、オブジェクト化することで色々と便利に使えます。(この話、長くなるのでこの辺で…)
list_match = list(o_path.glob('report_2021-08-12.csv'))
先程ダウンロードフォルダのPathオブジェクトを作成しましたので、そのフォルダ内にあるファイル一覧を取得し、条件に合致(ファイル名が一致)するファイルのリストを取得したいと思います。
glob()メソッドは、引数で指定した条件を満たすパスの一覧を取得してくれる。また下記の特殊文字が使えるメソッドです。
*: 長さ0文字以上の任意の文字列
?: 任意の一文字
[]: 特定の一文字
引き続きこちらを参考にさせて頂いてます。
path = str(list_match[0])
今回は条件に合致するユニークな(1つしか存在しない)ファイルのパスを取得したかったので
list_match[0]
としてインデックスに0を指定して1番目のファイルパスを指定しています(2番目以降は存在しない前提)。
ここは運用的には条件分岐などで改善していかないとポイントではあります。
str(list_match[0])
最後にstr()関数でPathオブジェクトを文字列に変換して完成です。ここにも登場するオブジェクトの概念。
print(list_match[0]) と
print(str(list_match[0])) で
見える結果が同じでも実体が違うので、このあたりの感覚が大切ですね。