[解決!Python]ファイルやディレクトリを名前変更/移動するには:osモジュール編:解決!Python
osモジュールが提供するrename関数とrenames関数を使って、ファイルやディレクトリの名前を変更したり、移動したりする方法を紹介する。
import os
with open('a.txt', 'wt') as f: # a.txtを作成
pass
with open('b.txt', 'wt') as f: # b.txtを作成
pass
# ファイルの名前変更
os.rename('a.txt', 'c.txt') # UNIX/Windows: 成功
# ファイル名を既存のファイルの名前に変更しようとする
# Windowsではファイル名を既存のファイルの名前には変更できない
# UNIXでは既存のファイルが警告なしに置き換えられる
os.rename('b.txt', 'c.txt') # UNIX: 成功、Windows: FileExistsError
# ファイル名を既存のディレクトリの名前に変更しようとすると例外となる
os.mkdir('mydir')
os.rename('c.txt', 'mydir') # IsADirectoryError/FileExistsError
# ファイルの移動
os.rename('c.txt', 'mydir/d.txt') # UNIX/Windows: 成功
# ディレクトリの名前変更
os.makedirs('dir1/dir2/dir3')
os.rename('dir1', 'dir4')
# 既存のディレクトリの名前に変更しようとした場合
os.mkdir('dir5')
os.rename('dir4', 'dir5') # Windows:FileExistsError
os.makedirs('dir6/dir7') # 空でないディレクトリ「dir6」を作成
os.rename('dir5', 'mydir') # ディレクトリが空でないと失敗する
# ディレクトリの移動
os.rename('dir5', 'dir6/dir7/dir5')
os.mkdir('a')
os.rename('a', 'x/a') # FileNotFoundError
ファイルやディレクトリの名前を変更したり、移動したりする方法
ファイルやディレクトリの名前を変更したり、別のディレクトリに移動したりするには幾つかの方法がある。
- osモジュールのrename/renames関数を使用する
- pathlibモジュールのPathクラスのrenameメソッドを使用する
- shutilモジュールのmove関数を使用する
本稿では、このうちosモジュールを使用する方法を紹介する。
os.rename関数
os.rename関数の基本的な構文を以下に示す。
os.rename(src, dst)
パラメーターsrcには変更前のファイルやディレクトリの名前を、パラメーターdstには変更後の名前を指定する。変更後の名前に「'dst_dir/dst_filename.ext」のようにディレクトリが含まれていれば、ファイルやディレクトリがそこに移動される。なお、os.renames関数はプラットフォームがUNIXかWindowsかで動作が異なる点には注意されたい(以下の表を参照)。
移動元 | 移動先 | UNIX | Windows |
---|---|---|---|
ファイル | 存在しない | 成功 | 成功 |
ファイル | ファイル | 成功 | FileExistsError |
ファイル | ディレクトリ | IsADirectoryError | FileExistsError |
ディレクトリ | 存在しない | 成功 | 成功 |
ディレクトリ | ファイル | NotADirectoryError | FileExistsError |
ディレクトリ | ディレクトリ(空) | 成功 | FileExistsError |
ディレクトリ | ディレクトリ(空ではない) | OSError | FileExistsError |
os.rename関数の動作 |
ファイルの名前変更
ファイルの名前を変更する例を以下に示す。
import os
with open('a.txt', 'wt') as f: # a.txtを作成
pass
with open('b.txt', 'wt') as f: # b.txtを作成
pass
# ファイルの名前変更
os.rename('a.txt', 'c.txt') # UNIX/Windows: 成功
この例では、a.txtファイルとb.txtファイルという空のファイルを2つ作成して、そのうちのa.txtファイルの名前を「b.txt」に変更している。os.rename関数のパラメーターdstに存在しないファイルを指定した場合には、UNIXでもWindowsでもこれは成功して、ファイルの名前が変更される。
しかし、パラメーターdstに既存のファイルの名前を指定すると、UNIXでは成功し、WindowsではFileExistsError例外が発生する。
os.rename('b.txt', 'c.txt') # UNIX: 成功、Windows: FileExistsError
この例は、最初に作成してあったb.txtファイルの名前を、os.rename関数で「c.txt」に変更しようとしている(この前のコード例でa.txtファイルをc.txtファイルに変更している点に注意)。
WindowsでVisual Studio Code(以下、VS Code)を実行し、そのターミナルからこのコードを実行した結果を以下に示す。
このようにFileExistsError例外が発生し、ファイルの名前は変更されない。
これに対して、UNIXではパラメーターsrcに指定したファイルで、パラメーターdstに指定したファイルが置き換えられる。以下はmacOSでVS Codeを実行して、そのターミナルから上記のコードを実行した結果だ。
また、パラメーターdstに既存のディレクトリの名前を指定した場合は、UNIX/Windowsのいずれでも失敗し、ファイルの名前は変更されない。
os.mkdir('mydir')
os.rename('c.txt', 'mydir') # IsADirectoryError/FileExistsError
ファイルの移動
既に述べたが、os.rename関数のパラメーターdstにディレクトリを含めると、ファイルはそこに移動する。以下に例を示す。
os.rename('c.txt', 'mydir/d.txt') # UNIX/Windows: 成功
これは、上でa.txtファイルから名前を変更した(あるいは、その後、b.txtファイルで上書きされた)c.txtファイルを、先ほど作成したmydirディレクトリに移動すると同時に、そのファイル名を「d.txt」に変更する例だ。
ただし、パラメーターdstに指定したパスに存在しないディレクトリが含まれていると失敗する。これを回避するには、本稿の最後に紹介するos.renames関数を使うとよい。
ディレクトリの名前変更
Copyright© Digital Advantage Corp. All Rights Reserved.