Python中shutil模块的使用

shutil模块

高级文件操作模块(High-level file operations)

下面粗略的介绍他的一些常用功能

一.关于copy

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

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

def copyfileobj(fsrc, fdst, length=16*1024):
    """copy data from file-like object fsrc to file-like object fdst"""
    while 1:
        buf = fsrc.read(length)
        if not buf:
            break
        fdst.write(buf)

从源码很清楚的可以看到,每次从源文件中读取buffer大小的内容写入目标文件。

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

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

3.copymode(src, dst, *, follow_symlinks=True)

仅仅复制权限。

shutil.copymode('test1','test')

os.stat('test1')
os.stat_result(st_mode=33024, st_ino=3419356, st_dev=64768, st_nlink=1, st_uid=500, st_gid=500, st_size=0, st_atime=1508722236, st_mtime=1508692014, st_ctime=1508751820)

os.stat('test')
os.stat_result(st_mode=33024, st_ino=3407875, st_dev=64768, st_nlink=1, st_uid=500, st_gid=500, st_size=3, st_atime=1508690220, st_mtime=1508690177, st_ctime=1508752356)

4.copystat(src, dst, *, follow_symlinks=True)

复制元数据,stat包括权限

5.copy(src, dst, *, follow_symlinks=True)

复制文件内容、权限和部分元数据,不包括创建时间和修改时间。
查看copy源码

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

实际上copy调用的copyfile和copymode

6.copy2(src, dst, *, follow_symlinks=True)

复制文件内容、权限和全部元数据,但需要平台支持。
查看copy2源码

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

实际上copy2调用的是copyfile和copystat

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

结合copytree源码分析:

  • 递归复制目录,默认使用的copy2,也就是复制全部元数据。
  • src、dst必须是目录,src必须存在,dst必须不存在
  • ignore = func,提供提个callable(src, names) -> ignore_names。提供一个函数,它会被调用src是源目录,names是os.listdir(src)的结果,就是列出src中的文件名,返回值是要被过滤的文件名的set类型数据
# 自定义一个ignore函数,可以忽略a开头的文件  
# names是os.listdir(src)返回的列表
# src是源文件
def ignore(src,names):
    return set(filter(lambda x: x.startswith("a"), names))

二丶关于rm删除

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

  • 递归删除。如同rm -rf一样危险,慎用。
  • 他不是原子操作,有可能删除错误,就会中断,已经删除的就删除了。
  • ignore_errors为True,忽略错误,当为False或者omitted时onerror生效。
  • onerror为callable,接收函数function、path和execinfo
shutil.rmtree('O:/tmp') # 类似 rm -rf,慎重

三丶关于move移动

move(src, dst, copy_function=copy2)

递归移动文件、目录到目标,返回目标。
本身使用的是os.rename方法。
如果不支持rename,如果是目录则copytree在删除源目。
默认使用copy2方法。

shutil还有打包功能。生成tar并压缩。支持zip、gz、bz、xz等

你可能感兴趣的:(Python)