Python复制、移动文件或文件夹:copy()、move()、rmtree()

在文件和文件夹管理中,复制、移动和删除非空目录是非常常见的操作。Python提供了shutil模块中的方法,能够方便、高效地完成这些任务。本节将详细介绍shutil.copy()shutil.move()shutil.rmtree()的使用方法,帮助读者掌握如何在编程中灵活操作文件系统。


1. 复制文件或目录:shutil.copy()shutil.copytree()

(1)shutil.copy()
shutil.copy() 用于将单个文件从源路径复制到目标路径。它不仅会复制文件内容,还会保留文件的权限信息(如可读、可写属性),但不会复制文件的元数据(如创建时间和修改时间)。

基本语法

shutil.copy(src, dst)
  • 参数src表示源文件路径,dst表示目标路径。
  • 如果目标路径是目录,则文件会复制到该目录下,并保持原文件名。

示例代码

import shutil

# 定义源文件和目标路径
src_file = "source.txt"
dst_dir = "backup_folder"

try:
    shutil.copy(src_file, dst_dir)  # 复制文件到目标目录
    print(f"文件 '{src_file}' 已成功复制到 '{dst_dir}'。")
except FileNotFoundError:
    print(f"源文件 '{src_file}' 不存在,请检查路径。")
except PermissionError:
    print("没有足够的权限进行复制操作。")

代码解析
上述代码中,shutil.copy() 方法将指定的文件source.txt复制到目标目录backup_folder中。try-except块用于捕获可能发生的异常,如文件不存在或权限不足的错误,从而提高代码的健壮性。


(2)shutil.copytree()
如果需要递归地复制整个目录,包括目录中的所有子目录和文件,可以使用shutil.copytree()方法。

基本语法

shutil.copytree(src, dst)
  • 参数src是源目录路径,dst是目标目录路径。
  • 如果目标路径已存在,会引发FileExistsError异常。

示例代码

import shutil

# 定义源目录和目标目录
src_dir = "source_folder"
dst_dir = "backup_folder"

try:
    shutil.copytree(src_dir, dst_dir)  # 递归复制整个目录
    print(f"目录 '{src_dir}' 已成功复制到 '{dst_dir}'。")
except FileExistsError:
    print(f"目标目录 '{dst_dir}' 已存在,请选择其他路径。")

代码解析
在该代码中,shutil.copytree() 会复制source_folder中的所有内容到backup_folder,包括嵌套的子目录和文件。如果目标路径已存在,则会抛出异常,因此需要提前确认目标路径是否为空。


2. 移动文件或目录:shutil.move()

shutil.move() 是一个强大的工具,用于将文件或目录从一个路径移动到另一个路径。如果目标路径已存在相同名称的文件或目录,则会覆盖目标内容。

基本语法

shutil.move(src, dst)
  • 参数src是源路径,dst是目标路径。
  • 支持文件和目录的移动。

示例代码

import shutil

# 定义源路径和目标路径
src_path = "old_folder"
dst_path = "new_folder"

try:
    shutil.move(src_path, dst_path)  # 移动文件或目录
    print(f"'{src_path}' 已成功移动到 '{dst_path}'。")
except FileNotFoundError:
    print(f"源路径 '{src_path}' 不存在,请检查路径。")
except PermissionError:
    print("没有足够的权限进行移动操作。")

代码解析
该代码中,shutil.move() 方法将old_folder目录移动到new_folder路径。如果目标路径是现有目录,则移动的内容会被存放在该目录下;如果目标路径是一个文件或不存在的路径,则会直接覆盖或创建目标。


3. 删除非空目录:shutil.rmtree()

shutil.rmtree() 是专门用于递归删除目录及其内容的方法,适用于需要一次性清空并删除整个目录的情况。

基本语法

shutil.rmtree(path)
  • 参数path是需要删除的目录路径。
  • 删除操作会清空目录中的所有文件和子目录,无法恢复。

示例代码

import shutil

# 定义需要删除的目录路径
dir_to_remove = "old_folder"

try:
    shutil.rmtree(dir_to_remove)  # 删除非空目录
    print(f"目录 '{dir_to_remove}' 已成功删除。")
except FileNotFoundError:
    print(f"目录 '{dir_to_remove}' 不存在。")
except PermissionError:
    print("没有足够的权限删除该目录。")

代码解析
上述代码中,shutil.rmtree() 会删除指定目录old_folder及其所有内容,包括子目录和文件。与文件的删除不同,删除目录时需要特别注意目标目录的路径正确性,以避免误删除重要数据。


通过对shutil.copy()shutil.move()shutil.rmtree()的学习,读者可以在实际编程中灵活地管理文件和目录。这些方法在数据备份、文件重命名以及自动化脚本中应用广泛,是Python文件管理中的重要工具。