04-文件和文件夹的移动与重命名
10.1.2 文件和文件夹的移动与重命名
调用 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文件扩展名的文本文件),但这可能不是你所希望的。这可能是程序中很难发现的bug,因为 move()
调用会自动地做一些事情,但和你所期望的完全不同。这也是使用 move()
要小心的另一个理由。
最后,构成目的地的各层级目录必须已经存在,否则Python会抛出异常。在交互式环境中输入以下代码:
>>> shutil.move('spam.txt', 'c:\\does_not_exist\\eggs\\ham')
Traceback (most recent call last):
--snip--
FileNotFoundError: [Errno 2] No such file or directory: 'c:\\does_not_exist\\
eggs\\ham'
Python在does_not_exist目录中寻找eggs和ham。它没有找到这个不存在的目录,因此不能将spam.txt移动到指定的路径。