連載
» 2019年10月25日 05時00分 公開

[Python入門]ディレクトリ操作の基本Python入門(2/3 ページ)

[かわさきしんじ,Deep Insider編集部]

ファイル/ディレクトリの削除

 ファイルを削除するにはos.remove関数またはos.unlink関数を、ディレクトリを削除するにはos.rmdir関数およびos.removedirs関数を使用する。

os.remove関数/os.unlink関数/os.rmdir関数/os.removedirs関数

os.remove(path)
os.unlink(path)
os.rmdir(path)
os.removedirs(path)


パラメーター 説明
path 削除対象のファイル/ディレクトリのパス
os.remove関数/os.unlink関数/os.rmdir関数/os.removedirs関数のパラメーター


 os.remove関数とos.unlink関数はファイル削除という同じ操作を行う。pathで指定したファイルがオープンされている場合、Windowsでは例外が発生するが、UNIXではファイルが削除されるという違いがあることには注意しよう。

 以下に例を示す。ここではosモジュールで定義されているsystem関数を使って、OSレベルのコマンドを実行することで、ファイルを削除している(OSレベルで「echo foo > foo/foo.txt」コマンドで実行して、fooディレクトリにfoo.txtファイルを作成している)。なお、実行結果は省略する。

os.system('echo foo > foo/foo.txt')
os.remove('foo/foo.txt')

ファイルの削除

 ディレクトリを削除する2つの関数のうち、os.rmdir関数は指定されたディレクトリパスの末尾のディレクトリのみを削除する。一方、os.removedirs関数は指定されたディレクトリパスに含まれる全てのディレクトリを削除するという違いがある。また、これら2つの関数はいずれもディレクトリが空の場合にのみディレクトリが完全に削除される(後述)。

 以下に例を示す。

os.rmdir('foo/bar/baz'# foo/barディレクトリにあるbazディレクトリを削除
print(os.listdir('foo/bar'))  # bazディレクトリが削除されたことを確認

os.mkdir('foo/bar/baz'# foo/bar/bazディレクトリを再作成
os.removedirs('foo/bar/baz'# foo、bar、bazの3つのディレクトリを削除
os.chdir('foo'# fooディレクトリがないので例外となる

ディレクトリを削除するコードの例

 このコードを実行すると次のようになる。

実行結果 実行結果

 os.removedirs関数の呼び出しにより、foo/bar/bazディレクトリが全て削除されているので、最後のos.chdir関数呼び出しでfooディレクトリに移動しようとしたところで例外が発生していることに注目してほしい。

 次にディレクトリが空でない状況でどうなるかを見てみよう(そのために、ここでは先ほどと同様にos.system関数を使ってファイルを作成している)。

os.makedirs('foo/bar/baz')
os.system('echo foo > foo/foo.txt')
os.system('echo bar > foo/bar/bar.txt')
os.system('echo baz > foo/bar/baz/baz.txt')
os.rmdir('foo/bar/baz')

ディレクトリが空でないと削除できない

 ここではカレントディレクトリの直下にfooディレクトリを、その下にbarディレクトリを、さらにその下にbazディレクトリを作成して、fooディレクトリにはfoo.txtファイルを、barディレクトリにbar.txtファイルを、bazディレクトリにbaz.txtファイルを作成した後に、foo/bar/bazディレクトリを削除しようとしている。

 このコードを実行すると次のようになる。

実行結果 実行結果

 ご覧のように、例外が発生したことが分かる。これはos.removedirs関数を呼び出しても同様だ。

 そこでos.remove関数を使ってfoo/bar/baz/baz.txtファイルを削除してから、os.rmdir関数を使ってfoo/bar/bazディレクトリを削除してみよう。

os.remove('foo/bar/baz/baz.txt')
os.rmdir('foo/bar/baz')
print(os.listdir('foo/bar'))

foo/bar/baz/baz.txtファイルを削除すれば、foo/bar/bazディレクトリは削除できる

 このコードを実行すると、次のようになる。

実行結果 実行結果

 baz.txtファイルを削除して、bazディレクトリが空になったので、foo/bar/bazディレクトリは削除できることが分かる。次に、bar.txtファイルを削除してからos.removedirs関数を使ってfoo/barディレクトリを削除してみるとどうなるかを確認してみよう。

os.remove('foo/bar/bar.txt')
os.removedirs('foo/bar')
print(os.listdir())
print(os.listdir('foo'))

bar.txtファイルは削除されたのでbarディレクトリは削除できる

 このコードを実行すると次のようになる。

実行結果 実行結果

 fooディレクトリは削除されていないことが分かる。これはbarディレクトリが削除されたが、fooディレクトリにはまだfoo.txtファイルがあるからだ。このように、os.removedirs関数は、pathに指定したディレクトリパスの末尾にあるディレクトリが削除できないときには例外を発生するが、一部でもディレクトリを削除できたときには例外を発生しないことにも注意しよう。

ファイル/ディレクトリの名前変更

 ファイルやディレクトリの名前を変更するにはos.rename関数、os.renames関数を使える。

os.rename関数/os.renames関数

os.rename(src, dest)
os.renames(src, dest)


 srcで指定されたファイルやディレクトリを、destで指定される名前に変更する。srcやdestにはディレクトリ階層を含めることが可能。destで指定される名前のファイルやディレクトリが既に存在している場合には、os.rename関数の振る舞いが状況によって異なる点には注意。

パラメーター 説明
src 名前を変更したいファイル/ディレクトリのパス
dest 変更後の名前
os.rename関数/os.renames関数のパラメーター


 os.rename関数はdestに指定した名前のファイルやディレクトリが既に存在している場合、Windowsでは常に例外が発生する。UNIXでは、srcで指定されるものがファイル、destで指定した先にあるのがディレクトリであれば(あるいはsrcがディレクトリ、destがファイルであれば)、例外が発生する。srcとdestがどちらもディレクトリかつdestが空のディレクトリであれば、destがsrcで置き換えられる。destが空でなければ、例外が発生する。srcとdestがどちらもファイルを指していれば、destがsrcで置き換えられる。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。