15
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonでディレクトリを(存在するかどうか確かめて存在しなかったら)作成する

Last updated at Posted at 2022-02-25

1. はじめに

ディレクトリの作成方法やチェック方法をよく忘れるので、自分の備忘録的に残しておきます。
僕と同じようにすぐ忘れちゃう系エンジニアや駆け出しエンジニアのお役に立てればと思い、しれっと初投稿。

ちなみに「あと10秒しか調べる時間がない…!」という危機に直面中の人は「まとめ」に飛んでください。

自分の動作環境は簡便ですがこんな感じです。
バージョン:Python 3.9.1
OS:Windows 10

2. ディレクトリ作成

ディレクトリを作成する関数を調べると以下の2つが出てきました。

python
import os

os.mkdir([ディレクトリパス])    # 1つめ
os.makedirs([ディレクトリパス]) # 2つめ

ただし、1つ目のos.mkdirは、「...../存在しないディレクトリ/存在しないディレクトリ」のように深い階層で存在しないディレクトリ群を作ることができないようなので、基本的には2つ目のos.makedirsを使っていくのがよさそうです。

よって今回はos.makedirsでディレクトリの作成方法をメモします(公式ドキュメントのリンクはまとめに貼っておきます)。
というわけで、ディレクトリ作成のコードは以下。

python
import os

dir = 'mydir' # 新たに作成するディレクトリ名やパス名
os.makedirs(dir) # 指定した名前(パス)でディレクトリを作成

以上です!いかがでしたか?お疲れさまでした!

…とはいかず、これはそのディレクトリがまだ存在していない時限定で、既に存在するディレクトリを同様に作成しようとすると以下のようなエラーが発生してしまいました。

FileExistsError: [WinError 183] 既に存在するファイルを作成することはできません: 'mydir'

3. ディレクトリの存在をチェックして作成(方法1)

というわけで、「まずは作りたいディレクトリの存在をチェックして、存在しなかった場合には作成する」ための方法は以下。
よく紹介されている方法なので(後述の方法2より1行多いけど)メモ。

python
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から追加実装されたそう)

python
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. まとめ

ディレクトリを作成するコードを書くときは、

python
import os

os.makedirs("ディレクトリパス", exist_ok=True)

が一番簡単らしい。
ただし exist_ok=Trueでファイルが既存かどうかチェックする機能が実装されたのはpython 3.2以降みたいだし、3.4.1より前ではちょっとエラーが出ちゃう場合もあるかも知れないから、バージョンには注意してね!(自分に言ってます)

公式ドキュメントはこちら。⇒ Python 3.9.1ドキュメント os.makedirs

15
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?