目录:
shutil 模块能极大提升处理文件任务的效率和代码的优雅度。
仅复制文件内容,不复制任何元数据。最基本的复制操作,要求 dst 必须是完整的文件路径,不能是目录。
import shutil
shutil.copyfile('test.yaml', 'test2.yaml')
复制文件内容及文件的权限位。如果 dst 指定为一个目录,文件将被复制到该目录下,并保持原文件名。
import shutil
shutil.copy('test.py', './python_scripts')
如果 dst 是文件路径,则执行复制并重命名。
import shutil
shutil.copy('test.py', './python_scripts/test2.py')
在 shutil.copy() 的基础上,还会复制文件的元数据,包括最后访问时间、修改时间等状态信息。这相当于 Unix 系统下的 cp -p 命令。
import shutil
shutil.copy2('test.yaml', 'test2.yaml')
在文件对象级别进行复制,允许对复制过程进行更精细的控制,例如分块读取以处理大文件。
import shutil
# 通过文件对象复制,适合处理大文件或网络流
with open('old.xml', 'r') as f1, open('new.xml', 'w') as f2:
shutil.copyfileobj(f1, f2)
递归复制整个目录树(包括所有子目录和文件)。目标目录 dst 必须不存在,该函数会自动创建。ignore 参数可用于过滤不需要复制的文件。
如下示例:将 my-app 项目复制到 Downloads 目录下,并忽略 node_modules 目录下的文件。
import shutil
src = '/Users/dkvirus/Projects/my-app'
dst = '/Users/dkvirus/Downloads/scaffold-fe'
shutil.copytree(src, dst, ignore=shutil.ignore_patterns('node_modules'))
递归删除整个目录树,功能强大需谨慎使用。
import shutil
# 删除 folder1 及其所有内容
shutil.rmtree('folder1')
递归移动文件或目录。如果 dst 是目录,则将 src 移动至该目录下;如果 dst 是文件路径,则执行移动并重命名。其行为类似于 Unix 的 mv 命令。
import shutil
# 将文件移动到另一个目录
shutil.move('/tmp/source.file', '/home/user/')
# 移动并重命名文件
shutil.move('old_name.txt', 'new_name.txt')
创建压缩包(如 ZIP、TAR),并返回压缩包的路径。
import shutil
# 将 /data 目录下的文件打包成 gzip 压缩的 tar 包,保存在当前目录,名为 data_bak.tar.gz
archive_path = shutil.make_archive("data_bak", 'gztar', root_dir='/data')
print(f"压缩包已创建:{archive_path}")
实际应用中,文件操作可能因权限不足、路径不存在等原因失败。使用 try-except 块进行异常捕获是必要的。
import shutil
import logging
logging.basicConfig(level=logging.INFO)
source = 'important.doc'
target = '/backup/important.doc'
try:
shutil.copy2(source, target)
logging.info(f"成功复制文件: {source} -> {target}")
except FileNotFoundError:
logging.error(f"源文件不存在: {source}")
except PermissionError:
logging.error(f"权限不足,无法写入目标位置: {target}")
except Exception as e:
logging.error(f"复制过程中发生未知错误: {e}")
↶ 返回首页 ↶