Python の os
インターフェースを調べてみましたが、ファイルを移動するメソッドを見つけることができませんでした。Python で $ mv ...
に相当するものをどのようにすればよいのでしょうか?
>>> source_files = '/PATH/TO/FOLDER/*'
>>> destination_folder = 'PATH/TO/FOLDER'
>>> # equivalent of $ mv source_files destination_folder
Os.rename()`、shutil.move()`、os.replace()`のいずれかを選択します。
いずれも同じ構文を採用しています。
import os
import shutil
os.rename("path/to/current/file.foo", "path/to/new/destination/for/file.foo")
shutil.move("path/to/current/file.foo", "path/to/new/destination/for/file.foo")
os.replace("path/to/current/file.foo", "path/to/new/destination/for/file.foo")
移動元と移動先の両方の引数に、ファイル名(file.foo
)を含める必要があることに注意してください。これが変更されると、ファイルは移動だけでなく名前も変更されます。
また、最初の2つのケースでは、新しいファイルが作成されるディレクトリがすでに存在していなければならないことにも注意してください。Windowsでは、そのような名前のファイルが存在しないと例外が発生しますが、os.replace()
は、そのような場合でも静かにファイルを置き換えます。
他の回答のコメントにもあるように、shutil.move
はほとんどの場合、os.rename
を単純に呼び出します。ただし、移動先が移動元と異なるディスク上にある場合は、代わりに移動元のファイルをコピーしてから削除します。
os.rename()と
shutil.move()はどちらもファイルの名前を変更しますが、Unixのmvコマンドに最も近いコマンドは
shutil.move()です。 違いは、
os.rename()はコピー元とコピー先が別のディスクにある場合は動作しないのに対し、
shutil.move()`はファイルがどのディスクにあるかを気にしないことです。
os.renameまたはshutil.moveのいずれかで、モジュールをインポートする必要があります。 すべてのファイルを移動させるために、*文字は必要ありません。
ここでは、/opt/awesomeにsourceというフォルダがあり、 awesome.txtというファイルがあります。
in /opt/awesome
○ → ls
source
○ → ls source
awesome.txt
python
>>> source = '/opt/awesome/source'
>>> destination = '/opt/awesome/destination'
>>> import os
>>> os.rename(source, destination)
>>> os.listdir('/opt/awesome')
['destination']
os.listdirを使って、実際にフォルダ名が変わったことを確認しました。 宛先を元に戻すshutilは以下の通りです。
>>> import shutil
>>> shutil.move(destination, source)
>>> os.listdir('/opt/awesome/source')
['awesome.txt']
今回は、ソースフォルダ内で、作成した awesome.txt が存在するかどうかを確認しました。 存在しています :)
これで、フォルダとそのファイルをコピー元からコピー先に移動し、また元に戻すことができました。