【python 内置模块】shutil

2024-01-20 00:00:00

目录:

shutil 模块能极大提升处理文件任务的效率和代码的优雅度。

shutil.copyfile(src, dst)

仅复制文件内容,不复制任何元数据。最基本的复制操作,要求 dst 必须是完整的文件路径,不能是目录。

import shutil

shutil.copyfile('test.yaml', 'test2.yaml')

shutil.copy(src, dst)

复制文件内容及文件的权限位。如果 dst 指定为一个目录,文件将被复制到该目录下,并保持原文件名。

import shutil

shutil.copy('test.py', './python_scripts')  

如果 dst 是文件路径,则执行复制并重命名。

import shutil

shutil.copy('test.py', './python_scripts/test2.py')  

shutil.copy2(src, dst)

在 shutil.copy() 的基础上,还会复制文件的元数据,包括最后访问时间、修改时间等状态信息。这相当于 Unix 系统下的 cp -p 命令。

import shutil

shutil.copy2('test.yaml', 'test2.yaml')

shutil.copyfileobj(fsrc, fdst[, length])

在文件对象级别进行复制,允许对复制过程进行更精细的控制,例如分块读取以处理大文件。

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'))

shutil.rmtree(path[, ignore_errors[, onerror]])

递归删除整个目录树,功能强大需谨慎使用。

import shutil

# 删除 folder1 及其所有内容
shutil.rmtree('folder1')

shutil.move(src, dst)

递归移动文件或目录。如果 dst 是目录,则将 src 移动至该目录下;如果 dst 是文件路径,则执行移动并重命名。其行为类似于 Unix 的 mv 命令。

import shutil

# 将文件移动到另一个目录
shutil.move('/tmp/source.file', '/home/user/')

# 移动并重命名文件
shutil.move('old_name.txt', 'new_name.txt')

shutil.make_archive(base_name, format, root_dir=None, …)

创建压缩包(如 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}")

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: