home changes contents help options

136:ファイルをコピーする

ファイルをコピーするには、shutilモジュールのcopy を使います。アクセス許可ビットもコピーしますが、最終アクセス時刻と最終更新時刻はコピーしません。copy2はcopyと同じですが、最終アクセス時刻と最終更新時刻もコピーするのでバックアップのときなどにはいいでしょう。
ファイルdstは作成されるか、既に存在すれば上書きされますが、途中のディレクトリは予め用意しておく必要があります。

 >>> import shutil
 >>> src='C:/Documents and Settings/Administrator/My Documents/inputspace.txt'
 >>> dst='C:/temp/inputspace.txt'
 >>> shutil.copy(src,dst)

曜日の名前のフォルダを作って、バックアップを取るpythonプログラム。一週間で回転させていく。

 import time
 import shutil
 import glob
 import os
 srcdir='/home/seko/temp/src/'
 file='backupdata.txt'
 srcfile=srcdir+file
 destdir='/home/seko/temp/dest/'
 DayofWeek=time.strftime('%A')
 destfile=destdir+'/'+DayofWeek+'/'+srcfile.split('/')[-1]
 try:
     os.remove(destfile)
 except OSError:
     print 'no such file'
 try:
     os.rmdir(destdir+DayofWeek)
 except OSError:
     print 'no such dir'
 os.makedirs(destdir+DayofWeek,mode=0777)
 shutil.copy2(srcfile,destfile)

shutil.copytree を使えば2二行でc:/backupからd:/backupにディレクトリを再帰的にコピーできます。

Windowsで暗号化したファイルを手動でNTFSフォーマットされた外付けUSBディスクにコピーすると、暗号が解除されないままコピーされます。 PCが壊れていざバックアップを使おうと思った時に、暗号化されていて読めなかった情けない経験があります。

下のプログラムを使えば、NTFSにコピーしても暗号化は解除されるし、日付もそのままです。 これはすばらしいですね。

 #!/usr/bin/env python
# -*- coding: utf-8 -*-
import shutil
shutil.copytree('c:/backup','d:/backup')

以下は前述のcopytree()関数のドキュメント文字列を省略した実装例 です。本モジュールで提供される他の関数の使い方を示しています。

 def copytree(src, dst, symlinks=0):
    names = os.listdir(src)
    os.mkdir(dst)
    for name in names:
        srcname = os.path.join(src, name)
        dstname = os.path.join(dst, name)
        try:
            if symlinks and os.path.islink(srcname):
                linkto = os.readlink(srcname)
                os.symlink(linkto, dstname)
            elif os.path.isdir(srcname):
                copytree(srcname, dstname, symlinks)
            else:
                copy2(srcname, dstname)
        except (IOError, os.error), why:
            print "Can't copy %s to %s: %s" % (`srcname`, `dstname`, str(why))