python学习--shutil模块

本文详细介绍了Python的shutil模块,包括copy复制功能,如copyfileobj、copyfile、copymode、copystat、copy和copy2的用法,以及rm删除操作的rmtree函数和move移动文件或目录的实现。提供了这些函数的基本概念和源码解析,帮助理解其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shutil模块


copy复制

copyfileobj(fsrc, fdst[, length])

  • 文件对象的复制, fsrc和fdst是open打开的文件对象, 复制内容, fdst要求可写
  • length 指定了buffer的大小

源码如下:

def copyfileobj(fsrc, fdst, length=16*1024):
    while 1:
        buf = fsrc.read(length) # 从fsrc读取文件
        if not buf: # 如果为空, 就break
            break
        fdst.write(buf) # 读取的文件写入fdst

copyfile(src, dst, *, follow_symlinks=True)

  • 复制文件内容,不含元数据。src、dst为文件的路径字符串
  • 本质上调用的就是copyfileobj,所以不带元数据二进制内容复制。

源码如下:

def copyfile(src, dst, *, follow_symlinks=True):
    if _samefile(src, dst): # 判断是否文件相同
        raise SameFileError("{!r} and {!r} are the same file".format(src, dst))

    for fn in [src, dst]:
        try:
            st = os.stat(fn)
        except OSError:
            # File most likely does not exist
            pass
        else:
            # XXX What about other special files? (sockets, devices...)
            if stat.S_ISFIFO(st.st_mode):
                raise SpecialFileError("`%s` is a named pipe" % fn)

    if not follow_symlinks and os.path.islink(src):
        os.symlink(os.readlink(src), dst)
    else:
        with open(src, 'rb') as fsrc:
            with open(dst, 'wb') as fdst:
                copyfileobj(fsrc, fdst) # 调用copyfileobj
    return dst

copymode(src, dst, *, follow_symlinks=True) 仅仅复制权限

copystat(src, dst, *, follow_symlinks=True) 复制元数据,stat包含权限

copy(src, dst, *, follow_symlinks=True)
复制文件内容、权限和部分元数据,不包括创建时间和修改时间。
本质上调用的是:
copyfile(src,dst,follow_symlinks=follow_symlinks)
copymode(src,dst,follow_symlinks=follow_symlinks)

源码如下:

def copy(src, dst, *, follow_symlinks=True):
   if os.path.isdir(dst):
       dst = os.path.join(dst, os.path.basename(src))
   copyfile(src, dst, follow_symlinks=follow_symlinks)
   copymode(src, dst, follow_symlinks=follow_symlinks)
   return dst

copy2比copy多了复制全部元数据,但需要平台支持。
本质上调用的是:
copyfile(src, dst, follow_symlinks=follow_symlinks)
copystat(src, dst, follow_symlinks=follow_symlinks)

源码如下:

def copy2(src, dst, *, follow_symlinks=True):
    if os.path.isdir(dst):
        dst = os.path.join(dst, os.path.basename(src))
    copyfile(src, dst, follow_symlinks=follow_symlinks)
    copystat(src, dst, follow_symlinks=follow_symlinks)
    return dst

copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)

  • 递归复制目录。默认使用copy2,也就是带更多的元数据复制。
  • src、dst必须是目录,src必须存在,dst必须不存在
  • ignore=func,提供一个callable(src,names) -> ignored_names。提供一个函数,它会被调用。src是源目录,
  • names是os.listdir(src)的结果,就是列出src中的文件名,返回值是要被过滤的文件名的set类型数据。

在这里插入图片描述

rm删除

shutil.rmtree(path, ignore_errors=False, οnerrοr=None)

  • 递归删除。如同rm-rf一样危险,慎用。
  • ignore_errors为true,忽略错误。当为False或者omitted时onerror生效。
  • onerror为callable,接受函数function、path和execinfo。
move移动

move(src, dst, copy_function=copy2)

  • 递归移动文件、目录到目标,返回目标。
  • 默认使用copy2方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值