Pythonでディレクトリを作成したり移動したりする

Pythonでファイルを読み書きする処理を書いていると、ディレクトリを作りたくなることありませんか?
osモジュールを使った方法を説明します。

Pythonでテキストファイルを読み書きする Pythonでテキストファイルを読み書きする

ディレクトリを作成する

os.mkdir

os.mkdirは新しくディレクトリを作成します。
https://docs.python.org/ja/3/library/os.html#os.mkdir

os.getcwdは現在の作業ディレクトリのパスを返します。
https://docs.python.org/ja/3/library/os.html#os.getcwd

新規ディレクトリ作成のサンプルコードです。
Cドライブの直下にnowというディレクトリを新規作成して、そこにnow.pyというファイルを置いて、以下のコードをコピーしてください。C:\now\now.pyという状態になっていると思います。
now.pyを実行すると、dir_01という新規ディレクトリが作成されます。

# 最初、Cドライブ直下にnowディレクトリを作成し、そこにnow.pyを新規作成し、このプログラムを書く。

# 現在の作業フォルダ。now.pyがある場所。
print(os.getcwd())
# c:\now

# 現在の作業フォルダにあるもの。now.pyのみ。
print(os.listdir(os.getcwd()))
# ['now.py']

# これから作成するディレクトリのパス。
path = os.path.join(os.getcwd(), 'dir_01')
print(path)
# c:\now\dir_01

# os.mkdirでディレクトリを新規作成。
os.mkdir(path)

# 新たなディレクトリdir_01ができた。
print(os.listdir(os.getcwd()))
# ['dir_01', 'now.py']

すでに存在するディレクトリを再度os.mkdirすると、FileExistsErrorになります。

# すでに存在するディレクトリを再度os.mkdirするとFileExistsErrorになる。
path = os.path.join(os.getcwd(), 'dir_01')
os.mkdir(path)
# FileExistsError: [WinError 183] 既に存在するファイルを作成することはできません。: 'c:\\now\\dir_01'

os.path.existsでファイルの存在確認してからos.mkdirするようにしましょう。

# ファイルの存在を確認してからos.mkdirするとエラーを避けられる。
path = os.path.join(os.getcwd(), 'dir_01')
if not os.path.exists(path):
    os.mkdir(path)

os.makedirs

os.makedirsは再帰的にディレクトリを作成します。
os.mkdirと似ていますが、末端ディレクトリを作成するために必要なすべての中間ディレクトリも作成します。
https://docs.python.org/ja/3/library/os.html#os.makedirs

ネストした複数の新規ディレクトリを作成するサンプルコードです。
Cドライブの直下にnow2というディレクトリを新規作成して、そこにnow2.pyというファイルを置いて、以下のコードをコピーしてください。C:\now2\now2.pyという状態になっていると思います。
now2.pyを実行すると、dir_01という新規ディレクトリが作成されます。
そして、dir_01直下にdir_02が、さらに、dir_02直下にdir_03が作成されていると思います。

# 最初、Cドライブ直下にnow2ディレクトリを作成し、そこにnow2.pyを新規作成し、このプログラムを書く。

# 現在の作業フォルダ。now2.pyがある場所。
print(os.getcwd())
# c:\now2

# 現在の作業フォルダにあるもの。now2.pyのみ。
print(os.listdir(os.getcwd()))
# ['now2.py']

# これから作成するディレクトリのパス。
# 複数の新規ディレクトリをネストした状態にする。
path = os.path.join(os.getcwd(), 'dir_01', 'dir_02', 'dir_03')
print(path)
# c:\now2\dir_01\dir_02\dir_03

# os.makedirsでディレクトリを新規作成。
os.makedirs(path)

# 新たなディレクトリdir_01ができた。その下にdir_02ができ、さらにその下にdir_03もできている。
print(os.listdir(os.getcwd()))
# ['dir_01', 'now2.py']

すでに存在するディレクトリをos.makedirsすると、FileExistsErrorになります。

# すでに存在するディレクトリを再度os.makedirsるとFileExistsErrorになる。
path = os.path.join(os.getcwd(), 'dir_01', 'dir_02', 'dir_03')
os.makedirs(path)
# FileExistsError: [WinError 183] 既に存在するファイルを作成することはできません。: 'c:\\now2\\dir_01\\dir_02\\dir_03'

Python 3.2からはos.makedirsには引数exist_okができたので、exist_ok=Trueで呼べばすでにディレクトリが存在してもエラーになりません

path = os.path.join(os.getcwd(), 'dir_01', 'dir_02', 'dir_03')
os.makedirs(path, exist_ok=True)
# exist_okを使えば、エラーにならない。

ディレクトリを移動する

os.chdir

os.chdir(path)は現在の作業ディレクトリをpathに設定します。
https://docs.python.org/ja/3/library/os.html#os.chdir

os.chdirをいつ使うのか?と思われる方がいるかもしれません。

例えば、プログラム実行中に、あるディレクトリでコマンドを打つような状況があれば、os.chdirを使います。

そのサンプルコードです。
Cドライブの直下にnow3というディレクトリを新規作成して、そこにnow3.pyというファイルを置いて、以下のコードをコピーしてください。C:\now3\now3.pyという状態になっていると思います。

import os
import subprocess

# 現在の作業ディレクトリを表示する。
print(os.getcwd())
# c:\now3

# now3ディレクトリ直下にdir_01ディレクトリを新規作成する。
os.makedirs(os.path.join(os.getcwd(), 'dir_01'), exist_ok=True)

# 現在の作業ディレクトリにあるものを表示する。
print(os.listdir(os.getcwd()))
# ['dir_01', 'now3.py']

# dir_01ディレクトリに移動する。
os.chdir(os.path.join(os.getcwd(), 'dir_01'))

# 現在の作業ディレクトリを表示する。
print(os.getcwd())
# c:\now3\dir_01

# pwdコマンドを打つ。
subprocess.call(['pwd'])
# /c/now3/dir_01

ハイライトしている行の”pwd”コマンドは、os.chdirしていないとそのディレクトリにおける”pwd”になりません