ファイル移動・操作
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を消せばいい。が、同一ドライブの場合、移動とコピーでは速度に差が出るため、もっと良い方法が無いだろうか。

