見出し画像

【python3】ファイルの存在を確認して、なかったら作る

pythonのファイル書き込みロジックは大体なかったら勝手に作ってくれることが多い気がしますが、たまに手動でやらないといけなくなるので覚書です。

結論

from pathlib import Path

file_path = "./file/no/path.txt"

# 親フォルダがなければ作る
if not file_path_obj.parent.exists():
    file_path_obj.parent.mkdir()

# ファイルが存在しなかったら作成する
file_path_obj = Path(file_path)
if not file_path_obj.exists():
    file_path_obj.touch()

やることとしてはこれだけ。
pathlibモジュールからPathクラスをインポートして、インスタンスを作って、存在確認してなかったらtouchメソッドで作る。
この時、親フォルダが存在しないとtouchメソッドがエラーになってしまうので、親フォルダがなければ作る処理も足しておきます。ただ、この方法だと1階層分までしかチェック入れられないので、2階層以上あるかないかわからないフォルダを指定する際は要注意です。

osモジュールを使って、

# ファイルが存在しなかったら作成する
if not os.path.isfile(file_path):
    with open(file= file_path, mode= "w") as f:
        pass

と記述する方法もあるんですが、安全性を優先してwithを使うとネストが深くなってしまう&「ファイルを作る」という仕事のために「ファイルを開いて何もせず閉じる」というプログラムを書かないといけなくて後々読みづらくなりそうなので、Pathlibを使う方法のほうが可読性が上がりそう。

ちなみに、pathlibのtouch()メソッドは内部で上記の処理をしているんだそうなので、今回の用途でpathlibを使うのはひとえに可読性を上げるため以外の意味はないです。

追記:「ファイルがあるかないか」にPath.exists()を使うときの注意

from pathlib import Path
test_path = Path()
print(test_path.exists())  // True

…って、Pathに何も引数を渡さずにインスタンスを作成した場合、デフォルトでカレントディレクトリ(実行ファイルが置いてあるフォルダ)の相対パス「 . 」が入ってしまって、「そのパスは、あるよ」と判定されてしまいます。
で、そのあとの処理が「そのパスは、あるよ」という前提で動いてしまうので、そういう場合は

if not image_path.exists() or not image_path.is_file():
    print("パスが存在しないか、ファイルパスじゃないよ")

で判定するのがよさそう。

この記事が気に入ったらサポートをしてみませんか?