python模块(shutil文件复制,移动)

python 标准库 -- shutil

shutil

shutil.move(src,dst)
shutil.move('/tmp/20170223/new','/tmp/20170223/test')   # 移动文件, 重命名等
shutil.copytree(src, dst, symlinks=False, ignore=None)
shutil.copytree('/tmp/20170223/','/tmp/20170223-2/')    # 递归复制
shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
shutil.rmtree(path, ignore_errors=False, οnerrοr=None)
shutil.rmtree('/tmp/20170223-2/')   # 递归删除目录树
shutil.get_archive_formats()
shutil.get_archive_formats()    # 返回支持的 压缩格式列表, 如 [(name,desc),('tar','uncompressed tar file')],
shutil.make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, dry_run=0, owner=None, group=None, logger=None)
shutil.make_archive('/tmp/20170223/new2','zip',root_dir='/tmp/20170223/')   # 创建压缩文件,

base_name : 压缩包的文件名, 也可以使压缩包的路径. 
format : 压缩种类
root_dir : 要压缩的文件夹路径, 默认当前目录
owner : 用户, 默认当前用户
group : 组, 默然当前组
shutil.copy(src, dst)
shutil.copy('/tmp/20170223/new','/tmp/20170223/new2')   # 复制文件及权限, Copy data and mode bits
shutil.copyfileobj(fsrc, fdst, length=16384)
shutil.copyfileobj(open('old.xml','r'), open('new.xml', 'w'))
# 将文件内容拷贝到另一个文件, copy data from file-like object fsrc to file-like object fdst
shutil.copyfile(src, dst)
shutil.copyfile('f1.log', 'f2.log')  # 拷贝文件, Copy data from src to dst
shutil.copymode(src, dst)
shutil.copymode('f1.log', 'f2.log')     # 仅拷贝权限,内容,用户,组不变,  Copy mode bits from src to dst
shutil.copystat(src, dst)
shutil.copystat('f1.log', 'f2.log')     # 仅拷贝状态信息, Copy all stat info (mode bits, atime, mtime, flags) from src to dst
shutil.copy2(src, dst)
shutil.copy2('f1.log', 'f2.log')    # 拷贝文件和状态信息, Copy data and all stat info
<think>嗯,我现在要学习Python中的shutil模块,这对我来说有点新。让我先想想,shutil是做什么的呢?好像和文件操作有关。对了,之前学过os模块,可以处理文件和目录,但听说shutil提供了更高级的文件操作功能。那具体有哪些功能呢? 首先,可能需要了解shutil模块的主要功能。可能包括复制移动、删除文件和目录,还有可能处理归档文件,比如压缩和解压?比如复制文件的话,os模块可能需要自己处理文件内容的读写,而shutil可能直接有函数可以完成。 比如shutil.copy()shutil.copy2(),这两个有什么区别呢?记得copy2会保留元数据,比如修改时间之类的,而普通的copy可能不会。还有shutil.copytree(),用来复制整个目录树,可能类似于递归复制所有子目录和文件移动文件的话,shutil.move()方法应该和os.rename()类似,但更强大,可以处理不同文件系统之间的移动?或者自动处理目录不存在的情况? 删除目录的话,os.rmdir()只能删除空目录,而shutil.rmtree()可以删除整个目录树,不管里面有没有文件。这个要小心使用,容易误删数据。 然后,归档功能,比如创建zip或tar文件shutil.make_archive()可能用来打包目录,支持不同的格式,比如zip、tar、gztar等。而解压的话,可能有shutil.unpack_archive()来处理不同的压缩文件格式。 另外,可能还有磁盘空间相关的功能,比如shutil.disk_usage()可以查看磁盘的使用情况,返回总空间、已用空间和剩余空间。这挺方便的,不用自己调用系统命令。 那举个例子,比如我要复制一个文件,可以用shutil.copy(src, dst)。如果目标是一个目录,文件会被复制到那个目录下,保持原名。如果是文件名,就会复制并重命名。而shutil.copy2()除了复制内容,还会保留文件的元数据,比如时间戳。 复制整个目录的话,shutil.copytree(src, dst)会递归复制,但目标目录必须不存在,否则会报错。可能需要设置参数dirs_exist_ok为True(Python 3.8以上)来允许覆盖已存在的目录。 移动文件或目录用shutil.move(src, dst),如果目标在同一个文件系统,会直接重命名,否则会复制到新位置然后删除原文件。 删除目录树的话,shutil.rmtree(path),这个要谨慎使用,因为它会直接删除整个目录,不会有确认提示。 创建归档文件,比如shutil.make_archive(base_name, 'zip', root_dir),会生成一个zip文件。解压的话用shutil.unpack_archive(filename, extract_dir),自动识别格式。 还有文件权限的处理,比如shutil.copystat()可以复制权限、时间等到目标文件,可能在copytree的时候有用。 不过要注意,有些函数在不同平台上的行为可能不同,比如权限处理或者符号链接的处理。比如在复制时,shutil.copy()是否会跟随符号链接?可能需要看文档,或者用copytree的symlinks参数来控制。 另外,处理大文件的时候,shutil模块的函数是否高效?应该比手动用Python读写更高效,因为是调用底层的系统命令。 可能还需要处理异常,比如在文件操作时,权限不足或者文件不存在,这时候需要捕获相应的异常,比如OSError或者shutil.Error。 总结一下,shutil模块简化了很多常见的文件操作任务,比os模块更高级,适合需要批量处理文件或目录的场景。比如备份文件、批量复制、清理目录等。 不过,要正确使用这些函数,需要注意参数的使用,比如目标路径是否存在,处理异常情况,以及跨平台兼容性。比如在Windows和Linux下路径的写法不同,或者权限的问题。 举个例子,假设我要备份一个项目目录到zip文件,可以用make_archive。或者需要删除一个临时生成的大目录,用rmtree。或者部署时复制静态资源到指定目录,可以用copytree。 总之,shutil是一个强大的工具,掌握它的常用函数可以大大提高文件操作的效率,避免重复造轮子。`</think>shutil` 是 Python 标准库中用于高级文件操作的模块,它简化了文件、目录的复制移动、删除及归档等操作。相比 `os` 模块,`shutil` 提供了更便捷的接口,适合处理批量文件和目录的任务。 --- ### **主要功能** #### **1. 复制操作** - **`shutil.copy(src, dst)`** 复制文件到目标路径。若 `dst` 是目录,文件会保留原名;若是文件名,则复制并重命名。**不保留元数据**(如修改时间)。 - **`shutil.copy2(src, dst)`** 类似 `copy()`,但**保留元数据**(如修改时间、权限等)。 - **`shutil.copytree(src, dst, dirs_exist_ok=False)`** 递归复制整个目录树。目标目录必须不存在(除非 `dirs_exist_ok=True`,Python 3.8+)。 #### **2. 移动操作** - **`shutil.move(src, dst)`** 移动文件或目录。若跨文件系统,会先复制再删除原文件。 #### **3. 删除操作** - **`shutil.rmtree(path)`** 递归删除整个目录树(包括子目录和文件),**慎用**(无确认提示)。 #### **4. 归档与解压** - **`shutil.make_archive(base_name, format, root_dir)`** 创建压缩包(如 ZIP、TAR)。 示例:将 `project` 目录打包为 `backup.zip`: ```python shutil.make_archive("backup", "zip", "project") ``` - **`shutil.unpack_archive(filename, extract_dir)`** 解压归档文件(支持 ZIP、TAR 等格式)。 #### **5. 其他工具** - **`shutil.disk_usage(path)`** 查看磁盘使用情况(总空间、已用、剩余)。 - **`shutil.which(cmd)`** 查找可执行文件的路径(类似命令行 `which`)。 --- ### **示例场景** 1. **备份目录为 ZIP 文件**: ```python import shutil shutil.make_archive("data_backup", "zip", "data") ``` 2. **复制目录(覆盖已存在目录)**: ```python shutil.copytree("src_folder", "dst_folder", dirs_exist_ok=True) ``` 3. **删除非空目录**: ```python shutil.rmtree("temp_files") ``` 4. **移动文件到新位置**: ```python shutil.move("old_file.txt", "new_folder/old_file.txt") ``` --- ### **注意事项** - **跨平台兼容性**:路径分隔符在 Windows 和 Linux 下不同(`\` vs `/`),建议使用 `os.path` 处理路径。 - **异常处理**:操作可能引发 `OSError` 或 `shutil.Error`,建议用 `try-except` 捕获。 - **符号链接**:默认情况下,`copytree` 会复制符号链接指向的内容(非链接本身),可通过 `symlinks=True` 修改。 --- ### **与 `os` 模块的区别** - `os` 提供基础操作(如单文件删除 `os.remove()`、创建目录 `os.mkdir()`)。 - `shutil` 专注于高级操作(如递归复制/删除、归档),简化复杂任务。 掌握 `shutil` 能显著提升文件管理效率,尤其适合自动化脚本开发(如数据备份、批量处理)。建议结合官方文档进一步探索:[Python shutil 文档](https://docs.python.org/3/library/shutil.html)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值