【python】(初心者向け)フォルダ / ファイルがない時にエラーじゃなくて察してほしい

こんにちは、くにまつです。
偉そうに初心者向けと書いてますが、自分用備忘録なので間違ってたらご指摘ください!!

今回やりたいこと

python3でファイルのやり取りする際に、該当ファイル / フォルダがなかった場合などでエラー終了を防ぎたい!!

くにまつ
くにまつ

csvをアウトプットする際に、アウトプット先を作り忘れてエラーが吐かれてしまうことが多々あります。特に年月などで動的にフォルダ構成が変わるなら手動で作成はもちろん避けたい!

もろもろ飛ばして解決策を見たい方はこちらからどうぞ!

エラーが発生するパターン

まず、エラーが発生するパターン
フォルダ構成がこんな感じの場合です

※[ ]で囲まれているのはフォルダ名
※ - で始まるのはファイル名
[dir] - writelog.py [log] [202305] ~~~ [202306] - 20230601.log ~~~ - 20230630.log
※[202307]フォルダはありません!

今までは6月分のログを格納するためのフォルダ[202306]が存在しました。
しかし、翌月の7月分のログを格納する際には、[202307]フォルダはありません。
pythonでは、 OSError: Cannot save file into a non-existent directory:’202307′ と指摘され
「存在しない202307フォルダには書き込みできなかったよ」とエラーが返ってきます。
なんと、運が悪いことに2023年07月01日は土曜日でした。土日休みの業務であれば二日間エラーでログが書けないかもしれないです。

そこで、手動運用ではなくpython自身が対象のフォルダを作ってしまえばいいじゃん!という対処をしたいです。

対応方法

先ほど、「python自身が対象のフォルダを作ってしまえばいいじゃん」と書きました。
また、エラーメッセージ OSError: Cannot save file into a non-existent directory:’202307′
見た感じ、「OS」オペレーションシステムのエラーみたいですね。
この二つが大体の答えで、今回はOSというモジュール(機能とか、部品って意味)を使って対処しましょう!

実際の書き方

【#】から始まる部分はコメントと呼ばれ、その行の最後までpythonとして扱わないので日本語でメモができます。
複数行のやり方もありますが今回は割愛で

Python3
import os # OSモジュールを使うと宣言します。※一つあればOK
os.mkdir("PATH") #"PATH"の部分は作りたいフォルダ名をいれます。このままだとPATHというフォルダができます。

もちろん、【”PATH”】と書いてますが、この部分を変数を使って表現ができます。
逆に、その文字のままの【PATH】フォルダを作れば解決するのであればわざわざpythonで書かずに
フォルダを作った方が楽だとは思います。【os.mkdir(“202307”)】を指定してフォルダが作られ感動しても
また一か月後に【202308】が作っておらずエラーになってしまい、折角の自動化の意味がなくなってしまいます。

実際のpython

Python
import os
import datetime
now_time = datetime.datetime.now() #現在時刻(年月日と時間)を取得する
# 2023-06-28 18:18:18.507710 [now_time]の中身
now_time_year_and_month = now_time.strftime('%Y%m') #現在時刻をYYYYMM形式にする
# 202306 [now_time_year_and_month]の中身
target_folder = './log/' + now_time_year_and_month + '/'
# ./log/202306/ [target_folder]の中身
today_log = now_time.strftime('%Y%m%d') + '.log' #現在時刻からYYYYMMDD形式にした後後ろに【.log】を付ける
# 20230628.log [today_log]の中身
if os.path.exists(target_folder): #もし【target_folder】が存在する場合 with open(target_folder + today_log, mode='w') as f: #YYYYMMDD.logの生成 f.write("ログの中身")
else : #もし、【target_folder】がなかった場合 os.mkdir(target_folder) #【target_folder】フォルダを作成 with open(target_folder + today_log, mode='w') as f: #YYYYMMDD.logの生成 f.write("ログの中身")

こんな感じになりそうです。
押さえておきたいポイントは

python
if os.path.exists(target_folder): ~フォルダがあった場合の処理~ pass #本当に何もなかったら素通りしてと記載!
else : ~フォルダがなかった場合の処理~ os.mkdir(target_folder)#みたいなやつ

こんな感じで、ifで存在するのYES/NOを確認してから作成するといいと思います。

ちなみに…

上の処理は、【202307】フォルダがない場合です。
そもそもさらに上の階層の【log】フォルダがない場合はエラーです。
言い換えると、target_folderが【./AA/BB/CC】の場合
【./AA/BB/】がある状態で【CC】フォルダを作りたい場合には
単数形の【os.mkdir(target_folder)】を使います。※python3.2以上のバージョン
もし、該当するフォルダが長くて途中のフォルダがない可能性がある場合は
複数形の下記コードでいけます。後ろの【, exist_ok=True】は、途中にフォルダなかったらついでに作ってね!って合図です

python 3.2+
os.makedirs(target_folder, exist_ok=True)

コメントを残す

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