你可以使用 Python 实现一个简单的文件拷贝工具,利用内建的 shutil 模块。shutil 提供了高效的文件操作功能,包含文件复制和移动等操作。
1. 使用 shutil.copy 和 shutil.copy2
shutil.copy(src, dst):将源文件(src)复制到目标路径(dst)。它仅复制文件内容和权限信息。
shutil.copy2(src, dst):与 shutil.copy 类似,但它还会保留源文件的时间戳信息。
2. 进阶:拷贝目录(包括目录中的文件)
shutil.copytree(src, dst) 可以用来复制整个目录及其内容。
下面是一个简单的文件拷贝工具实现:
import shutil
import os
def copy_file(src, dst):
"""复制单个文件"""
try:
# 如果目标路径是一个目录,文件将被复制到该目录中
if os.path.isdir(dst):
dst = os.path.join(dst, os.path.basename(src))
# 复制文件,保留元数据(如时间戳)
shutil.copy2(src, dst)
print(f"文件 '{src}' 成功复制到 '{dst}'")
except Exception as e:
print(f"文件复制失败: {e}")
def copy_directory(src, dst):
"""复制整个目录"""
try:
# 复制整个目录树
shutil.copytree(src, dst)
print(f"目录 '{src}' 成功复制到 '{dst}'")
except Exception as e:
print(f"目录复制失败: {e}")
示例:复制文件
copy_file('source_file.txt', 'destination_file.txt')
示例:复制目录
copy_directory('source_directory', 'destination_directory')
代码解释:
复制单个文件:copy_file 函数通过 shutil.copy2 将源文件复制到目标路径。如果目标是一个目录,它会将文件复制到该目录中。
复制整个目录:copy_directory 使用 shutil.copytree 来递归地复制整个目录及其内容。
3. 处理目录结构中的冲突
在实际操作中,如果目标文件已经存在,shutil.copy2 会覆盖它。如果你想避免这种情况,可以加入一些检查来防止覆盖。例如,检查目标文件是否存在,或者使用 os.path.exists() 来判断目标路径是否已经存在。
import shutil
import os
def copy_file_with_check(src, dst):
"""复制文件,避免覆盖目标文件"""
if os.path.exists(dst):
print(f"目标文件 '{dst}' 已存在,复制操作已被跳过。")
else:
shutil.copy2(src, dst)
print(f"文件 '{src}' 成功复制到 '{dst}'")
示例:复制文件
copy_file_with_check('source_file.txt', 'destination_file.txt')
4. 进阶:增加进度条(可选)
如果要处理大量文件或大文件,可能会希望在复制过程中显示进度条。可以使用 tqdm 库来显示进度条。
from tqdm import tqdm
import shutil
import os
def copy_file_with_progress(src, dst):
"""显示进度条的文件复制"""
try:
# 获取文件大小
total_size = os.path.getsize(src)
# 打开源文件并创建目标文件
with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:
# 使用 tqdm 显示进度条
for chunk in tqdm(iter(lambda: fsrc.read(1024 * 1024), b''), total=total_size // (1024 * 1024), unit='MB'):
fdst.write(chunk)
print(f"文件 '{src}' 成功复制到 '{dst}'")
except Exception as e:
print(f"文件复制失败: {e}")
示例:复制文件并显示进度条
copy_file_with_progress('large_file.txt', 'large_file_copy.txt')
总结
这个简单的工具涵盖了复制文件、复制目录以及进度条显示。你可以根据需求扩展功能,比如支持命令行参数、过滤特定文件类型、添加日志记录等。