一、拷贝文件

1、shutil.copyfile(src, dst):复制文件内容(不包含元数据)从src到dst。 DST必须是完整的目标文件名;拷贝目录参见shutil.copy()。如果src和dst是同一文件,就会引发错误shutil.Error。dst必须是可写的,否则将引发异常IOError。如果dst已经存在,它会被替换。特殊文件,例如字符或块设备和管道不能使用此功能,因为copyfile会打开并阅读文件。 src和dst的是字符串形式的路径名。copyfile()调用了底函数层copyfileobj()。

import shutil

shutil.copyfile(r'E:\python\1.txt',r'E:\python\2.txt')

==>运行结果可以看到,1.txt中的内容被复制到了2.txt

2、shutil.copyfileobj(fsrc, fdst[, length]):复制文件内容(不包含元数据)从类文件对象src到类文件对dst。可选参数length指定缓冲区的大小,负数表示一次性读入。默认会把数据切分成小块拷贝,以免占用太多内存。注意:拷贝是从fsrc的当前文件开始。如果fdst已经存在,它会被替换。

import shutil

f1 = open(r'E:\python\1.txt','r')

f2 = open(r'E:\python\2.txt','w')

shutil.copyfileobj(f1,f2,length=16*1024)

f1.close()

f2.close()

==>运行结果可以看到,1.txt中的内容被复制到了2.txt

3、shutil.copy(src, dst):复制文件src到文件或目录dst。如果dst是目录,使用src相同的文件名创建(或覆盖),权限位也会复制。src和dst的是字符串形式的路径名。

import shutil

shutil.copy(r'E:\python\1.txt',r'E:\python\3.txt')

==>运行结果可以看到,1.txt中的内容被复制到了3.txt

4、shutil.copy2(src, dst): 类似shutil.copy,元数据也复制,实际上先调用shutil.copy,然后使用copystat。这类似于Unix命令cp -p。dst最后一级目录下的文件不存在,则会被创建。

import shutil

shutil.copy2(r'E:\python\1.txt',r'E:\python\4.txt')

==>运行结果可以看到,1.txt中的内容被复制到了4.txt

5、shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,ignore_dangling_symlinks=False):将src路径下的所有的目录及文件复制到dst所指定的目录下,注意dst中指定的目录必须要不存在。

import shutil

shutil.copytree(r'E:\python\project',r'D:\8\7')

==>运行后,可以看到在D盘下产生了8\7的目录结构,而7目录下的所有目录和文件则来自于E:\python\project目录下的所有目录和文件。

二、拷贝文件元数据

当由UNIX下创建文件默认基于umask设置权限,copymode()可以复制权限。

shutil.copymode(src, dst):从SRC复制权限位到DST。该文件的内容,所有者和组不受影响。src和dst的是字符串形式的路径名。

copymode('shutil_copymode.py', 'file_to_change.txt')

要想拷贝文件时间戳,需要copystat。

1、shutil.copystat(src, dst): 从src复制权限位,最后访问时间,最后修改时间,flag到dst。该文件的内容,所有者和组不受影响。 src和dst的是给定的字符串路径名。dst最后一级目录下的文件不存在,则会报FileNotFoundError的错误。

import shutil

shutil.copystat(r'E:\python\1.txt',r'E:\python\5.txt')

==>运行后,5.txt的最后访问时间,最后修改时间,与1.txt相同

三、压缩解压

2.7以后的版本提供了压缩和解压功能。

格式:shutil.make_archive(base_name, format[, root_dir[, base_dir, verbose, dry_run, owner, group, logger])

base_name: 压缩包的文件名,也可以是压缩包的路径。如果是文件名时,则保存至当前目录,否则保存至指定路径,为路径时,最后一级目录名为压缩包的名称。
format: 压缩包种类,“zip”, “tar”, “bztar”,“gztar”。
root_dir: 要压缩的文件夹路径(默认当前目录)。
owner: 用户,默认当前用户。
group: 组,默认当前组。
logger: 用于记录日志,通常是logging.Logger对象。

import shutil

shutil.make_archive(r'E:\1','zip',r'E:\python\新建文件夹')

==>运行后,在E:\1目录下,生成了一个叫1.zip的压缩文件。

四、删除非空目录

1、shutil.rmtree(path, ignore_errors=False, onerror=None):删除一个非空的目录,该目录下可以存在其他目录和文件。

import shutil

shutil.rmtree(r'E:\python\新建文件夹')

==>运行后,E:\python\新建文件夹   路径下的最后一个目录将会被删除。