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等