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