shutil模块
- 文件拷贝:使用打开2个文件对象,源文件读取内容,写入目标文件中来完成拷贝过程。但是这样丢失stat数据信息(权限等),因为根本没有复制这些信息过去
- 如何目录复制,Python提供了一个方便的库shutil(高级文件操作)
copy复制
copyfileobj(fsrc, fdst[, length])
- 文件对象的复制,fsrc和fdst是open打开的文件对象,复制内容。fdst要求可写,length指定了表示buffer的大小
import shutil
with open('/etc/test', 'r+') as f1:
f1.write('abcd\n1234')
f1.flush()
f1.seek(0)
with open('/etc/test1', 'w+') as f2:
shutil.copyfileobj(f1,f2)
copyfileobj源码
def copygileobj(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)
copyfile(src, dst, *, follow_symlinks=True)
- 复制文件内容,不含元数据。src, dst为文件的路径字符串
- 本质上调用的就是copyfileobj,所以不带元数据二进制内容复制
copymode(src, dst, *, follow_symlinks=True)
- 仅仅复制权限

copystat(src, dst, *, follow_symlinks=True)
copy(src, dst, *, follow_symlinks=True)
- 复制文件内容、权限和部分元数据,不包括创建时间和修改时间
- 本质上调用的是
copyfile(src, dst, follow_symlinks=follow_symlinks)
copymode(src, dst, follow_symlinks=follow_symlinks)
copy2
- 比copy多了复制全部元数据,但需要平台支持
- 本质上调用的是
copyfile(src, dst, follow_symlinks=follow_symlinks)
copystat(src, dst, follow_symlinks=follow_symlinks)
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类型数据
def ignore(src, names):
ig = filter(lambda x: x.startswith('a'), names)
return set(ig)
shutil.copytree('/etc/temp', '/etc/python/o', ignore=ignore)
rm 删除
shutil.rmtree(path, ignore_errors=False, οnerrοr=None)
- 递归删除。如同rm -rf一样危险,慎用
- 它不是原子操作,有可能删除错误,就会中断,已经删除的就删除了
- ignore_errors为True,忽略错误。当为False或者omitted时onerror生效
- onerror为callable,接受函数function、path和execinfo
shutil.rmtree('/etc/bin')
move 移动
move(src, dst, copy_function=copy2)
- 递归移动文件、目录到目标,返回目标
- 本身使用的是 os.rename方法
- 如果不支持rename,如果是目录则copytree再删除源目录
- 默认使用copy2方法
os.rename('/etc/bin/t.txt', '/etc/temp/t')
os.rename('test3', '/etc/temp/test300')
- shutil还有打包功能。生成tar并亚索。支持zip、gz、bz、xz