1. shutil.copyfile( src, dst) #从源src复制到dst中去。 如果当前的dst已存在的话就会被覆盖掉
  2. shutil.move( src, dst) #移动文件或重命名
  3. shutil.copymode( src, dst) #只是会复制其权限其他的东西是不会被复制的
  4. shutil.copystat( src, dst) #复制权限、最后访问时间、最后修改时间
  5. shutil.copy( src, dst) #复制一个文件到一个文件或一个目录
  6. shutil.copy2( src, dst) #在copy上的基础上再复制文件最后访问时间与修改时间也复制过来了,类似于cp –p的东西
  7. shutil.copy2( src, dst) #如果两个位置的文件系统是一样的话相当于是rename操作,只是改名;如果是不在相同的文件系统的话就是做move操作
  8. shutil.copytree( olddir, newdir, True/Flase) #把olddir拷贝一份newdir,如果第3个参数是True,则复制目录时将保持文件夹下的符号连接,如果第3个参数是False,则将在复制的目录下生成物理副本来替代符号连接
  9. shutil.rmtree( src ) #递归删除一个目录以及目录内的所有内容

os模块不仅提供了新建文件、删除文件、查看文件属性的操作功能,还提供了对文件路径的操作功能。但是,对于移动、复制、打包、压缩、解压文件及文件夹等操作,os模块没有提供相关的函数,此时需要用到shutil模块。shutil模块是对os模块中文件操作的补充,是Python自带的关于文件、文件夹、压缩文件的高层次的操作工具,类似于高级API。

1、移动文件或文件夹

使用shutil.move函数可以将指定的文件或文件夹移动到目标路径下,返回值是移动后的文件绝对路径字符串。

import shutil

shutil.move('D:\\test\\a\dog.txt', 'D:\\test\\b')

如果目标路径指向的文件夹中已经存在了同名文件,那么该文件将被重写;如果目标路径指向一个具体的文件,那么指定的文件在移动后将被重命名。

注意:目标路径下的文件夹必须是已经存在的,否则程序会返回错误。

2、复制文件

shutil.copyfile(src,dst)可以从src文件复制内容(不包含元数据)到dst文件。dst必须是完整的目标文件名,返回值是复制后的文件绝对路径字符串。

import shutil

shutil.copyfile('D:\\test\\a\dog2.txt', 'D:\\test\\b\dog1.txt')

如果src和dst是同一文件,就会引发错误shutil.Error。dst文件必须是可写的,否则将引发异常IOError。如果dst文件已经存在,则它会被替换。对于特殊文件,例如字符或块设备文件和管道不能使用此功能,因为copyfile会打开并读取文件。

shutil.copy(src,dst)可以复制文件src到文件或目录dst。如果dst是目录,则会使用src相同的文件名创建(或覆盖),文件权限也会复制,返回值是复制后的文件绝对路径字符串。

import shutil

shutil.copy('C:\\Users\\45543\\Desktop\\pi_digits.txt', 'C:\\Users\\45543\\MyFile.txt')

'C:\\Users\\45543 \\MyFile.txt'

shutil模块还提供了shutil.copytree函数用于进行目录的复制。

import shutil

shutil.copytree('D:\\test\\a','D:\\test\c')

注意:test文件中不存在c。

3、永久删除文件和文件夹

使用os.unlink函数会删除指定的文件;

使用os.rmdir函数会删除路径指定的文件夹,但是这个文件夹必须是空的,不能包含任何文件或子文件夹;

使用shutil.rmtree函数可以删除路径指定的文件夹,并且这个文件夹里面的所有文件和子文件夹都会被删除。

因为涉及对文件与文件夹的永久删除,因此以上函数的使用必须要非常谨慎。

import shutil

import os

os.unlink('D:\\test\c')


Traceback (most recent call last):
  File "D:/test/test.py", line 5, in <module>
    os.unlink('D:\\test')
PermissionError: [WinError 5] 拒绝访问。: 'D:\\test'



os.rmdir('D:\\test\c')

Traceback (most recent call last):
  File "D:/test/test.py", line 7, in <module>
    os.rmdir('D:\\test')
PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: 'D:\\test'



shutil.rmtree('D:\\test\c')

如果存在以下树结构

 - user
   - tester
     - noob
   - developer
     - guru

即 user 目录下存在多级子目录

如果要递归删除user\tester 目录的内容,可使用shutil.rmtree()函数

import shutil
shutil.rmtree(r'user\tester')

mkdir -p foo/bar
python
import shutil
shutil.rmtree('foo/bar')

将会仅仅删除bar

4、压缩与解压文件

      Python 2.7版本之后就提供了使用shutil模块实现文件压缩与解压的功能。shutil.make_archive函数的相关参数设置如下表所示。shutil.make_archive函数将test.zip压缩包中的文件解压到了指定路径(C:\\Users\\45543\\Desktop)下的test文件夹里。对压缩文件进行解压处理,需要用到shutil.unpack_archive函数。

                                                                 shutil.make_archive函数的相关参数

    参数说明                                                                             功能
base_name    压缩包的文件名,也可以是压缩包的路径,是文件名时,则保存至当前目录,否则保存至指定路径
format            压缩包种类,可以是zip、tar、bztar、gztar
root_dir          要压缩的文件夹路径(默认当前目录)
owner            用户,默认当前用户
group            组,默认当前组
logger           用于记录日志,通常是logging.Logger对象
import shutil

shutil.make_archive("C:\\Users\\45543\\Desktop\\test", 'zip',root_dir= 'C:\\Users\\45543\\Desktop\\程序')

shutil.unpack_archive('C:\\Users\\45543\\Desktop\\test.zip', 'C:\\Users\\ 45543\\Desktop\\test')

 

import shutil

shutil.move('D:\\test\\a\dog.txt', 'D:\\test\\b')
import shutil

shutil.copyfile('D:\\test\\a\dog2.txt', 'D:\\test\\b\dog1.txt')
import shutil

shutil.copy('C:\\Users\\45543\\Desktop\\pi_digits.txt', 'C:\\Users\\45543\\MyFile.txt')

'C:\\Users\\45543 \\MyFile.txt'
import shutil

shutil.copytree('D:\\test\\a','D:\\test\c')
import shutil

import os

os.unlink('D:\\test\c')


Traceback (most recent call last):
  File "D:/test/test.py", line 5, in <module>
    os.unlink('D:\\test')
PermissionError: [WinError 5] 拒绝访问。: 'D:\\test'



os.rmdir('D:\\test\c')

Traceback (most recent call last):
  File "D:/test/test.py", line 7, in <module>
    os.rmdir('D:\\test')
PermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: 'D:\\test'



shutil.rmtree('D:\\test\c')
 - user
   - tester
     - noob
   - developer
     - guru
import shutil
shutil.rmtree(r'user\tester')

mkdir -p foo/bar
python
import shutil
shutil.rmtree('foo/bar')
import shutil

shutil.make_archive("C:\\Users\\45543\\Desktop\\test", 'zip',root_dir= 'C:\\Users\\45543\\Desktop\\程序')

shutil.unpack_archive('C:\\Users\\45543\\Desktop\\test.zip', 'C:\\Users\\ 45543\\Desktop\\test')