一.shutil模块介绍
shutil模块提供了一系列对文件和文件集合的高阶操作。 特别是提供了一些支持文件拷贝和删除的函数。 对于单个文件的操作可以参考os模块。
1.1 目录和文件操作
操作命令 | 操作命令解释 |
---|---|
shutil.copyfileobj(fsrc, fdst[, length]) | 将文件类对象 fsrc 的内容拷贝到文件类对象 fdst。 整数值 length 如果给出则为缓冲区大小。 特别地, length 为负值表示拷贝数据时不对源数据进行分块循环处理;默认情况下会分块读取数据以避免不受控制的内存消耗。 请注意如果 fsrc 对象的当前文件位置不为 0,则只有从当前文件位置到文件末尾的内容会被拷贝。 |
shutil.copyfile(src, dst, *, follow_symlinks=True) | 将 src 文件的内容(不含元数据)拷贝到 dst 文件并返回 dst。 src 和 dst 是字符串形式的路径。 dst 必须是完整的目标文件名;对于接受一个目标目录路径的拷贝请参见 shutil.copy() 。 如果 src 和 dst 指定了同一文件,则将引发 SameFileError 。 |
exception shutil.SameFileError | 此异常会在 copyfile() 中的源和目标为同一文件时被引发。 |
shutil.copymode(src, dst, *, follow_symlinks=True) | 从 src 拷贝权限位到 dst。 文件的内容、所有者和分组将不受影响。 src 和 dst 均为字符串形式的路径名。 如果 follow_symlinks 为假值,并且 src 和 dst 均为符号链接,copymode() 将尝试修改 dst 本身的模式(而非它所指向的文件)。 此功能并不是在所有平台上均可用;请参阅 copystat() 了解详情。 如果 copymode() 无法修改本机平台上的符号链接,而它被要求这样做,它将不做任何操作即返回。 |
shutil.copystat(src, dst, *, follow_symlinks=True) | 从 src 拷贝权限位、最近访问时间、最近修改时间以及旗标到 dst。 在 Linux 上,copystat() 还会在可能的情况下拷贝“扩展属性”。 文件内容、所有者和分组将不受影响。 src 和 dst 均为字符串形式的路径名。 |
shutil.copy(src, dst, *, follow_symlinks=True) | 将文件 src 拷贝到文件或目录 dst。 src 和 dst 应为字符串。 如果 dst 指定了一个目录,文件将使用 src 中的基准文件名拷贝到 dst。 返回新创建文件所对应的路径。 |
shutil.copy2(src, dst, *, follow_symlinks=True) | 类似于 copy() ,区别在于 copy2() 还会尝试保留文件的元数据 |
shutil.ignore_patterns(*patterns) | 这个工厂函数会创建一个函数,它可被用作 copytree() 的 ignore 可调用对象参数,以忽略那些匹配所提供的 glob 风格的 patterns 之一的文件和目录。 参见以下示例。 |
shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False) | 递归地拷贝以 src 为根路径的整个目录树,返回目标目录。 名为 dst 的目标目录不必已存在;它本身和还不存在的父目录都将被自动创建。 目录的权限和时间信息将通过 copystat() 来拷贝,单独的文件将使用 shutil.copy2() 来拷贝。 |
shutil.rmtree(path, ignore_errors=False, onerror=None) | 删除一个完整的目录树;path 必须指向一个目录(但不能是一个目录的符号链接)。 如果 ignore_errors 为真值,删除失败导致的错误将被忽略;如果为假值或是省略,此类错误将通过调用由 onerror 所指定的处理程序来处理,或者如果此参数被省略则将引发一个异常。 |
shutil.move(src, dst, copy_function=copy2) | 递归地将一个文件或目录 (src) 移至另一位置 (dst) 并返回目标位置。 |
shutil.disk_usage(path) | 返回给定路径的磁盘使用统计数据,形式为一个 named tuple,其中包含 total, used 和 free 属性,分别表示总计、已使用和未使用空间的字节数。 在 Windows 上,path 必须是一个目录;在 Unix 上,它可以是一个文件或一个目录。 |
shutil.chown(path, user=None, group=None) | 修改给定 path 的所有者 user 和/或 group |
shutil.which(cmd, mode=os.F_OK or os.X_OK, path=None) | 返回当给定的 cmd 被调用时将要运行的可执行文件的路径。 如果没有 cmd 会被调用则返回 None |
exception shutil.Error | 此异常会收集在多文件操作期间所引发的异常。 对于 copytree() ,此异常参数将是一个由三元组 (srcname, dstname, exception) 构成的列表。 |
1.2 归档操作
操作命令 | 操作命令解释 |
---|---|
shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]]) | 创建一个归档文件(例如 zip 或 tar)并返回其名称 |
shutil.get_archive_formats() | 返回支持的归档格式列表。 所返回序列中的每个元素为一个元组 (name, description) |
shutil.register_archive_format(name, function[, extra_args[, description]]) | 为 name 格式注册一个归档程序 |
shutil.unregister_archive_format(name) | 从支持的格式中移除归档格式 name |
shutil.unpack_archive(filename[, extract_dir[, format]]) | 解包一个归档文件。 filename 是归档文件的完整路径。 |
shutil.register_unpack_format(name, extensions, function[, extra_args[, description]]) | 注册一个解包格式。 name 为格式名称而 extensions 为对应于该格式的扩展名列表,例如 Zip 文件的扩展名为 .zip。 |
shutil.unregister_unpack_format(name) | 撤销注册一个解包格式。 name 为格式的名称。 |
shutil.get_unpack_formats() | 返回所有已注册的解包格式列表。 所返回序列中的每个元素为一个元组 (name, extensions, description)。 |
二.shutil模块实例
2.1 shutil.copyfileobj
shutil.copyfileobj(文件1,文件2):将文件1的数据覆盖copy给文件2。
代码:
import shutil
f1 = open("1.txt",encoding="utf-8")
f2 = open("2.txt","w",encoding="utf-8")
shutil.copyfileobj(f1,f2)
2.2 shutil.copyfile
shutil.copyfile(文件1,文件2):不用打开文件,直接用文件名进行覆盖copy。
代码:
import shutil
shutil.copyfile("1.txt","3.txt")
2.3 shutil.copymode
shutil.copymode(文件1,文件2):只拷贝权限,内容组,用户,均不变。
def copymode(src,dst):
"""copy mode bits from src to dst"""
if hasattr(os,'chmod'):
st = os.stat(stc)
mode = stat.S_IMODE(st.st_mode)
os.chmod(dst,mode)
2.4 shutil.copystat
shutil.copystat(文件1,文件):只拷贝了权限。
2.5 shutil.copy
shutil.copy(文件1,文件2):拷贝文件和权限都进行copy。
2.6 shutil.copy2
shutil.copy2(文件1,文件2):拷贝了文件和状态信息。
2.7 shutil.copytree
shutil.copytree(源目录,目标目录):可以递归copy多个目录到指定目录下。
2.8 shutil.rmtree
shutil.rmtree(目标目录):可以递归删除目录下的目录及文件。
2.9 shutil.move
shutil.move(源文件,指定路径):递归移动一个文件。
2.10 shutil.make_archive()
shutil.make_archive():可以压缩,打包文件。
代码:
import shutil
shutil.make_archive("shutil_archive_test","zip","E:\python\learn_python1\shutil")
测试结果:
2.11 shutil.disk_usage(path)
shutil.disk_usage(path) 返回给定路径的磁盘使用统计数据,形式为一个 named tuple,其中包含 total, used 和 free 属性,分别表示总计、已使用和未使用空间的字节数。 在 Windows 上,path 必须是一个目录;在 Unix 上,它可以是一个文件或一个目录。
代码:
import shutil
BytesPerGB = 1024 * 1024 * 1024
(total, used, free) = shutil.disk_usage("E:\python\learn_python1\shutil")
print ("Total: %.2fGB" % (float(total)/BytesPerGB))
print ("Used: %.2fGB" % (float(used)/BytesPerGB))
测试记录:
E:\python\learn_python1\venv\Scripts\python.exe E:/python/learn_python1/shutil/shutil_test3.py
Total: 465.76GB
Used: 409.95GB
Total: 465.76GB
Used: 409.95GB
Process finished with exit code 0