1. はじめに
ディレクトリの作成方法やチェック方法をよく忘れるので、自分の備忘録的に残しておきます。
僕と同じようにすぐ忘れちゃう系エンジニアや駆け出しエンジニアのお役に立てればと思い、しれっと初投稿。
ちなみに「あと10秒しか調べる時間がない…!」という危機に直面中の人は「まとめ」に飛んでください。
自分の動作環境は簡便ですがこんな感じです。
バージョン:Python 3.9.1
OS:Windows 10
2. ディレクトリ作成
ディレクトリを作成する関数を調べると以下の2つが出てきました。
import os
os.mkdir([ディレクトリパス]) # 1つめ
os.makedirs([ディレクトリパス]) # 2つめ
ただし、1つ目のos.mkdir
は、「...../存在しないディレクトリ/存在しないディレクトリ」のように深い階層で存在しないディレクトリ群を作ることができないようなので、基本的には2つ目のos.makedirs
を使っていくのがよさそうです。
よって今回はos.makedirs
でディレクトリの作成方法をメモします(公式ドキュメントのリンクはまとめに貼っておきます)。
というわけで、ディレクトリ作成のコードは以下。
import os
dir = 'mydir' # 新たに作成するディレクトリ名やパス名
os.makedirs(dir) # 指定した名前(パス)でディレクトリを作成
以上です!いかがでしたか?お疲れさまでした!
…とはいかず、これはそのディレクトリがまだ存在していない時限定で、既に存在するディレクトリを同様に作成しようとすると以下のようなエラーが発生してしまいました。
FileExistsError: [WinError 183] 既に存在するファイルを作成することはできません。: 'mydir'
3. ディレクトリの存在をチェックして作成(方法1)
というわけで、「まずは作りたいディレクトリの存在をチェックして、存在しなかった場合には作成する」ための方法は以下。
よく紹介されている方法なので(後述の方法2より1行多いけど)メモ。
import os
dir = "mydir"
if not os.path.exists(dir): # ディレクトリが存在するか確認
os.makedirs(dir) # ディレクトリ作成
os.path.exists(dir)
は、指定したディレクトリdirが存在すればTrue
、なければFalse
を返します。
ディレクトリが存在しなかったとき(False
だったとき)だけ作成したいので、if not
で判定しています。
重ねて作成しようとしたときに親切に何か出力したい時なんかがあれば使える感じかしら?
ちなみにos.path.exists()
は、ディレクトリだけでなくファイルが存在するかどうかのチェックにも使えるので覚えておこう(自分に言ってます)。
4. ディレクトリの存在をチェックして作成(方法2)
makedirs
のコードを見たところ、方法1のようにif文を使わなくても、以下1行でできてしまうようでした。
(ドキュメントを見るとこの方法はバージョン3.2から追加実装されたそう)
import os
dir = "mydir"
os.makedirs(dir, exist_ok=True)
makedirs
の引数に「exist_ok=True
」を入れると、方法1のようにif文で2行書かなくても良いようです。
デフォルトだと(引数に書かないと)「exist_ok=False
」になっているので、方法1のようにif文で分岐が必要になるわけです。
というわけで、比較的最近のバージョンを使っているのであればこれが一番楽そうですね。
5. makedirs() の exist_ok=True
に関する余談
ここからはちょっと細かい話。
このmakedirsのコードを見ると、引数まで書くとmakedirs(name, mode=0o777, exist_ok=False)
となっています。
公式ドキュメントを読んでみると、第2引数のmodeはディレクトリの権限モードを表すらしく、3.4.1より以前では動作が不安定な部分もあったようです。
以下、公式ドキュメントからの引用です。
Python 3.4.1 より前、 exist_ok が True でそのディレクトリが既存の場合でも、 makedirs() は mode が既存ディレクトリのモードと合わない場合にはエラーにしようとしていました。このモードチェックの振る舞いを安全に実装することが出来なかったため、 Python 3.4.1 でこのチェックは削除されました。
というわけで、恐らくpython 3.4.1以降での使用を推奨する感じ、ということでしょうか…?
6. まとめ
ディレクトリを作成するコードを書くときは、
import os
os.makedirs("ディレクトリパス", exist_ok=True)
が一番簡単らしい。
ただし exist_ok=True
でファイルが既存かどうかチェックする機能が実装されたのはpython 3.2以降みたいだし、3.4.1より前ではちょっとエラーが出ちゃう場合もあるかも知れないから、バージョンには注意してね!(自分に言ってます)
公式ドキュメントはこちら。⇒ Python 3.9.1ドキュメント os.makedirs