如何在Python中复制非空文件夹?(模拟Unix的cp -r命令)
实现类似Unix
cp -r 的文件/目录复制功能 问题分析
你当前的代码会报错,因为shutil.copytree()仅用于复制目录,而你的源路径指向单个文件(/tmp/Folder1/file.txt),不符合该函数的使用场景。
解决方案
要实现类似cp -r的功能(同时支持文件和目录复制,且保留源路径的层级结构到目标目录),可以封装一个自定义函数,结合shutil.copy2()(复制文件)和shutil.copytree()(复制目录),并自动处理路径层级的创建:
import os import shutil def cp_r(source, dest): # 判断源是文件还是目录,构建目标路径 if os.path.isfile(source): # 提取源文件所在的父目录名,拼接目标路径 src_parent_dir = os.path.basename(os.path.dirname(source)) target_file_path = os.path.join(dest, src_parent_dir, os.path.basename(source)) # 创建目标父目录(不存在则创建) os.makedirs(os.path.dirname(target_file_path), exist_ok=True) # 复制文件,保留元数据(如修改时间) shutil.copy2(source, target_file_path) elif os.path.isdir(source): # 提取源目录名,拼接目标目录路径 src_dir_name = os.path.basename(source) target_dir_path = os.path.join(dest, src_dir_name) # 复制整个目录,允许目标目录已存在(合并内容) shutil.copytree(source, target_dir_path, dirs_exist_ok=True) else: raise FileNotFoundError(f"源路径 {source} 不存在或无效") # 调用示例:复制单个文件并保留层级 cp_r('/tmp/Folder1/file1.txt', '/tmp/Folder2/')
代码说明
- 文件复制逻辑:自动提取源文件的父目录名,在目标路径下创建对应子目录,再复制文件,最终得到
/tmp/Folder2/Folder1/file1.txt的结果。 - 目录复制逻辑:直接将源目录完整复制到目标路径下,
dirs_exist_ok=True参数支持目标目录已存在时的合并(和cp -r行为一致)。 - 兼容性:适用于Python 3.8及以上版本(
dirs_exist_ok参数在3.8版本后引入)。
内容的提问来源于stack exchange,提问作者Rahul Kumar Vishwakrma
相关产品推荐
相关产品推荐

