プログラミングをしていると必要に応じてディレクトリ(フォルダ)の操作を扱うことがあります。
しかし、Pythonでのディレクトリの扱いについてよくわかっていない方も多いのではないでしょうか。
「ディレクトリ(フォルダ)の作成方法が知りたい」
「ディレクトリのパーミッションを設定したい」
「ディレクトリの存在確認を行いたい」
という方に向けて、以下の内容について解説していきます!
【基礎】ディレクトリ(フォルダ)の作成」
【基礎】ディレクトリへの権限(パーミッション)の付与
【発展】ディレクトリがないときだけmkdirする
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
ディレクトリ(フォルダ)の作成
ディレクトリとはそもそも、コンピューターのディスク中にデータを整理して保存するための仕組み、箱のようなものです。
ディスクの中に、名前をつけた場所を作成しその中にファイルを保存することで、多数のファイルを整理して扱えます。
Pythonでは他のコンピュータ言語と同様に、ファイルの操作と共にこのディレクトリを作成や削除など管理出来ます。
それでは、主なPythonでのディレクトリの管理方法を順番に見て行きましょう。
os.mkdirでディレクトリを作成
まず単純に一階層のディレクトリの作成方法です。
下の例は、現在のカレントディレクトリ(現在プログラムが動作して居るディレクトリの事)に、「dir_01」というサブディレクトリを作成します。
os.mkdir(’dir_01’)
または、以下のように実行します。
os.mkdir(‘./dir_01’)
下の例は、ルートディレクトリ直下の’tmp’ディレクトリ中に、’01’というサブディレクトリを作成します。
os.mkdir(‘/tmp/dir_01’)
上記一つ目の例のように現在動作するディレクトリによっては、作成されるディレクトリの場所が違うので注意が必要です。
カレントディレクトリとは無関係にディレクトリを作成したい場合は、必ずルートディレクトリを示す「/」からディレクトリ場所を指定して下さい。
os.makedirsでネストしたディレクトリを一気に作成
複数のディレクトリを持った深いディレクトリを一度に作成したい時には、下記のメソッドを使います。
os.makedirs(‘dir_01/dir_02/dir_03’)
このメソッドでは、末端の’dir_03’ディレクトリを作成するために必要なすべての中間ディレクトリ(‘dir_01’, ‘dir_02’)が存在しなければ自動的に作成します。
ディレクトリへの権限(パーミッション)の付与
ファイルやディレクトリには、ディレクトリを指定するための名前の他に、所有者や所属グループ、その他のユーザとそれに伴う権限などの属性を指定出来ます。
新しくファイルやディレクトリを作成した場合は、所有者や所属グループは現在のユーザとそのユーザの所属グループになります。
それでは、どのような権限があるか下記に詳しく見て行きましょう。
そもそも権限(パーミッション)とは?
単純に言うと、ファイルやディレクトリの権限(パーミッション)とは、そのファイルやディレクトリを読んだり、書いたり出来るかと言うことです。
対象がファイルの場合は、その他に実行できる/できないの権限も存在します。
そして権限は、その作成者である所有者に対するだけでなく、所有者が所属他のユーザやその他のユーザに対しても指定する事が可能です。
個人で使用するPCではあまり関係ないかもしれませんが、所属グループやその他のユーザに対する権限設定は、みんなで使うサーバーなどにおいては重要な設定項目です。
os.chmodで権限を付与
Pythonでディレクトリに権限を設定する時使用するのは、下記のchmodメソッドを使います。
os.chmod(path, mode,…)
path:権限設定するディレクトリ
mode:権限設定の値
modeは、通常3桁の8進数を使用して権限を指定します。
modeの値は、実際のプログラミングでは8進数を表すための先頭の’0′(ゼロ)を付与して、2桁目から左から順に所有者,グループ,その他のユーザーの権限を表します。
例えば、このメソッドを使って先ほど作成したディレクトリに次の様に権限を指定する事が可能です。
os.chmod(‘dir_01/dir_02/dir_03’, 0644)
- 所有者:’6′
- グループ:’4′
- その他:’4′
各権限桁の値の意味は、それぞれ下記になります。
0 — 1 —x 2 -w- 3 -wx 4 r— 5 r-x 6 rw- 7 rwx r 読み込み権限 w 書き込み権限 x 実行権限
したがって、下記の様な権限設定にした事になります。
- 所有者:読み書き権限
- グループ:読み込み権限
- その他:読み込み権限
モードの値には、次のようにstatモジュールの定数を使用する事も出来ますが、他の言語やOSでもよく使われる8進数での権限設定を覚えておく方が応用が利きます。
os.chmod(‘dir_01/dir_02/dir_03’, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) #0644と同等
ディレクトリがないときだけmkdirする
これまでディレクトリの指定を見てきましたが、ディレクトリがすでに存在していた場合はどうなるでしょうか?
一度ディレクトリを作成した後に、もう一度同様なコードを走らせてみて下さい。
エラーが起きると思います。実際のプログラミングでは、ディレクトリを作成した後プログラムがストップしてはいけません。
このエラーを回避する方法は大きく3種類あります。
- ディレクトリがすでに存在するか否かをチェックして、なかった時だけディレクトリを作成する方法
- os.mkdir()メソッドにexist_ok=True オプションを指定してエラーを抑制する方法
- エラーをtryでハンドリングする方法
ディレクトリがすでに存在するか否かをチェックする方法
if os.path.isdir(“mydir”)==False: os.mkdir(‘dir_01’)
exist_ok=True オプションを指定する方法
os.mkdir(‘dir_01’, exist_ok=True)
エラーをtryでハンドリングする方法
try: os.mkdir(‘dir_01’) except FileExistsError as e: pass # エラーを無視する
通常は一つ目のディレクトリがすでに存在するか否かをチェックする方法で十分ですが、その他のやり方についても応用のため知っておくと良いでしょう。
まとめ
今回は、pythonでのディレクトリの扱いを学習しました!
学習のポイントをもう一度おさらいしておきましょう!
- ディレクトリ(フォルダ)を作成する
- ディレクトリへの権限(パーミッション)の付与する
- ディレクトリの有無を調べてエラーが出ない様にmkdirする
上記内容を踏まえて、ぜひ自分のプログラムにも活かせるように学習を進めていきましょう!