ファイルを削除するには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'))
このコードを実行すると、次のようになる。
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'))
このコードを実行すると次のようになる。
fooディレクトリは削除されていないことが分かる。これはbarディレクトリが削除されたが、fooディレクトリにはまだfoo.txtファイルがあるからだ。このように、os.removedirs関数は、pathに指定したディレクトリパスの末尾にあるディレクトリが削除できないときには例外を発生するが、一部でもディレクトリを削除できたときには例外を発生しないことにも注意しよう。
ファイルやディレクトリの名前を変更するには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.