shutil模块是一个shell集成工具,其中包含了可以用于文件复制、移动、重命名和删除的功能。

复制文件和文件夹

shutil.copy(source, destination)复制文件

调用shutil.copy(source, destination),将source处的文件复制到destination处。

  • source指向文件名称,

  • destination如果是个文件夹名,就把source处的文件复制到该文件夹,

  • destination如果是个文件名, 这个名称就会作为被复制文件的新名称。

  • 目标文件夹不存在会报错。

  • 返回值是复制后的文件路径。

>>> import shutil
>>> from pathlib import Path
# 把a.txt复制到一个文件夹
>>> shutil.copy(Path.cwd() / 'a.txt', Path.cwd() / 'folderB')
'C:\\Users\\yx\\Desktop\\folderA\\folderB\\a.txt'

# 把a.txt复制到新文件夹并给定一个新名字
>>> shutil.copy(Path.cwd() / 'a.txt', Path.cwd() / 'folderB/copyed_a.txt')
WindowsPath('C:/Users/yx/Desktop/folderA/folderB/copyed_a.txt')

# 如果destination路径不存在,就会报错(FileNotFoundError)
>>> shutil.copy(Path.cwd() / 'a.txt', Path.cwd() / 'folderC/folderD')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\yx\AppData\Roaming\uv\python\cpython-3.11.13-windows-x86_64-none\Lib\shutil.py", line 431, in copy
    copyfile(src, dst, follow_symlinks=follow_symlinks)
  File "C:\Users\yx\AppData\Roaming\uv\python\cpython-3.11.13-windows-x86_64-none\Lib\shutil.py", line 258, in copyfile
    with open(dst, 'wb') as fdst:
         ^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\yx\\Desktop\\folderA\\folderC\\folderD'

shutil.copytree(source, destination)复制文件夹及子目录的所有内容

  • 目标文件夹不存在会自动创建

  • 返回值是复制后的文件路径。

>>> shutil.copytree(Path.cwd() / 'folderB', Path.cwd() / 'folderB_backup')
WindowsPath('C:/Users/yx/Desktop/folderA/folderB_backup')

移动、重命名文件和文件夹

shutil.move(source, destination)函数可以把source处的文件夹移动到destination

  • 如果destination是一个文件夹,就把source文件移动到这个文件夹;当然,如果destination处有重名的,就会覆盖。

  • 如果destination是一个文件名,source文件就会被移动并重命名。

  • 如果destination是一个不存在的文件夹,source文件会被重命名为这个文件夹的名字,并且没有扩展名,这需要注意。同样的情况在shutil.copy()也存在。

  • 最后一个/前的各级目录必需都存在,否则会报错(FileNotFoundError

  • 返回值是新位置的路径。

# destination是文件夹
>>> shutil.move(Path.cwd() / 'folderB/a.txt', Path.cwd() / 'folderC')
'C:\\Users\\yx\\Desktop\\folderA\\folderC\\a.txt'
# destination是文件名
>>> shutil.move(Path.cwd() / 'folderB/b.txt', Path.cwd() / 'folderC/new_b.txt')
WindowsPath('C:/Users/yx/Desktop/folderA/folderC/new_b.txt')
# destination是不存在的文件夹
>>> shutil.move(Path.cwd() / 'folderB/c.txt', Path.cwd() / 'folderC/folderD')  
WindowsPath('C:/Users/yx/Desktop/folderA/folderC/folderD')

永久地删除文件和文件夹

  • os.unlink(path)path是文件名,删除path指向的文件;

  • os.rmdir(path)path是文件夹名,删除path处的文件夹,该文件夹必需为空;

  • shutil.rmtree(path),删除path处的文件夹及其内部所有的文件和子文件夹。

  • 以上的删除是永久删除,保险起见,先print()检查一下,再添加删除代码为宜。

>>> os.unlink(Path.cwd() / 'folderB/copyed_a.txt')   # 文件copyed_a.txt被永久删除
>>> os.rmdir(Path.cwd() / 'folderB')  # 空文件夹folderB被删除

>>> shutil.rmtree(Path.cwd() / 'folderB_backup')  # 文件夹folderB_backup及其所有内容都被删除

安全地删除文件和文件夹

上面的函数是永久删除,不可恢复。使用第三方的send2trash模块,可以将被删除的文件和文件夹送至回收站。

这是第三方模块,使用前记得先安装。

>>> import send2trash
>>> testFile = open('testFile.txt','w',encoding='utf8')
>>> testFile.write("this is a test file, it will be deleted soon")
44
>>> testFile.close()
>>> send2trash.send2trash('testFile.txt')  # 文件被移动到回收站

>>> shutil.copytree('folderC', 'copyed_folderC')
'copyed_folderC'
>>> send2trash.send2trash('copyed_folderC')  # 文件夹被移动到回收站