shutil(或称为 shell 工具)模块中包含一些函数,让你在 Python 程序中复制、
移动、改名和删除文件。要使用 shutil 的函数,首先需要 import shutil。
1.调用shutil.copy(source, destination),将路径source 处的文件复制到路径destination
处的文件夹(source 和 destination 都是字符串)。如果 destination 是一个文件名,它将
作为被复制文件的新名字。该函数返回一个字符串,表示被复制文件的路径。
>>> import shutil, os
>>> os.chdir('C:\\')
>>> shutil.copy('C:\\spam.txt', 'C:\\delicious')
'C:\\delicious\\spam.txt'
>>> shutil.copy('eggs.txt', 'C:\\delicious\\eggs2.txt')
'C:\\delicious\\eggs2.txt'
2.shutil.copy()将复制一个文件,shutil.copytree()将复制整个文件夹,以及它包含
的文件夹和文件。调用 shutil.copytree(source, destination),将路径 source 处的文件
夹,包括它的所有文件和子文件夹,复制到路径 destination 处的文件夹。source 和
destination 参数都是字符串。该函数返回一个字符串,是新复制的文件夹的路径。
在交互式环境中输入以下代码:
>>> import shutil, os
>>> os.chdir('C:\\')
>>> shutil.copytree('C:\\bacon', 'C:\\bacon_backup')
'C:\\bacon_backup'
shutil.copytree()调用创建了一个新文件夹,名为 bacon_backup,其中的内容与
原来的 bacon 文件夹一样。现在你已经备份了非常非常宝贵的“bacon”。
3.调用 shutil.move(source, destination),将路径 source 处的文件夹移动到路径
destination,并返回新位置的绝对路径的字符串。
如果 destination 指向一个文件夹,source 文件将移动到 destination 中,并保持
原来的文件名。例如,在交互式环境中输入以下代码:
>>> import shutil
>>> shutil.move('C:\\bacon.txt', 'C:\\eggs')
'C:\\eggs\\bacon.txt'
假定在 C:\目录中已存在一个名为 eggs 的文件夹,这个 shutil.move()调用就是
说,“将 C:\bacon.txt 移动到文件夹 C:\eggs 中。
如果在 C:\eggs 中原来已经存在一个文件 bacon.txt,它就会被覆写。因为用这
种方式很容易不小心覆写文件,所以在使用 move()时应该注意。
destination 路径也可以指定一个文件名。在下面的例子中,source 文件被移动
并改名。
>>> shutil.move('C:\\bacon.txt', 'C:\\eggs\\new_bacon.txt')
'C:\\eggs\\new_bacon.txt'
这一行是说,“将 C:\bacon.txt 移动到文件夹 C:\eggs,完成之后,将 bacon.txt
文件改名为 new_bacon.txt。”
前面两个例子都假设在 C:\目录下有一个文件夹 eggs。但是如果没有 eggs 文件
夹,move()就会将 bacon.txt 改名,变成名为 eggs 的文件。
>>> shutil.move('C:\\bacon.txt', 'C:\\eggs')
'C:\\eggs'
这里,move()在 C:\目录下找不到名为 eggs 的文件夹,所以假定 destination 指
的是一个文件,而非文件夹。所以 bacon.txt 文本文件被改名为 eggs(没有.txt 文件
扩展名的文本文件),但这可能不是你所希望的!这可能是程序中很难发现的缺陷,
因为 move()调用会很开心地做一些事情,但和你所期望的完全不同。这也是在使用
move()时要小心的另一个理由。
最后,构成目的地的文件夹必须已经存在,否则 Python 会抛出异常。
4.利用 os 模块中的函数,可以删除一个文件或一个空文件夹。但利用 shutil 模块,
可以删除一个文件夹及其所有的内容。
? 用 os.unlink(path)将删除 path 处的文件。
? 调用 os.rmdir(path)将删除 path 处的文件夹。该文件夹必须为空,其中没有任
何文件和文件夹。
? 调用 shutil.rmtree(path)将删除 path 处的文件夹,它包含的所有文件和文件夹都
会被删除。