ファイル移動・操作

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

programming/python/tips/file_operation.txt · 最終更新: 2022/03/17 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0