ファイル移動・操作
pythonにおけるファイル操作は、基本 shutil
を使えば良いが、細かな挙動は把握しておく必要がある。
copyとcopy2
どちらもファイルをコピーするコマンドだが、
copy
はメタデータをコピーしない。つまり、コピー先ファイルの更新日時等はコピー時のものになるcopy2
はそれらを元ファイルと同じにする
コピー先が既に存在
shutil.copy, copy2
shutil.copy(src, dst, *, follow_symlinks=True) shutil.copy2(src, dst, *, follow_symlinks=True)
- srcはファイル限定
- dstが既存ファイルの場合、上書き
- dstが既存ディレクトリの場合、その中に入れられる
shutil.move
shutil.move(src, dst, copy_function=copy2)
- srcはファイル/ディレクトリ両方可
- srcがファイルの場合
- dstが既存ファイルの場合、上書き
- dstが既存ディレクトリの場合、その中に入れられる
- srcがディレクトリの場合
- dstが既存ファイルの場合、エラー
- dstが既存ディレクトリの場合、その中に入れられる
src, dstがディレクトリ同士でも、dstの中にsrcが入れられる点に注意。
distutils.dir_util.copy_tree
- ※非推奨
- 以前はディレクトリをコピーする一手段だったが、いつの間にかdeprecatedになっていた
- srcはディレクトリ限定
- dstが存在するファイルの場合、エラー
- dstが存在するディレクトリの場合、統合(その中で競合する場合は上書き)
update=1
を引数に加えると「最終更新日時がsrcと同じか新しい場合」は上書きしない
aaa\ aaa\ |-bbb.txt |-bbb.txt `-ccc.txt(1) copy_tree('ddd', 'aaa') |-ccc.txt(2) ddd\ ----------------------> `-eee.txt |-ccc.txt(2) ddd\ `-eee.txt |-ccc.txt(2) `-eee.txt ※ccc.txt は区別するため(1)(2)を付けているが、実際のファイル名には無いとする
「ディレクトリを移動したいが、dstが存在したら統合したい」場合は、ひとまずcopy_tree
後、srcを消せばいい。が、同一ドライブの場合、移動とコピーでは速度に差が出るため、もっと良い方法が無いだろうか。