shutil模块用于文件拷贝,包括文件内容,文件权限等信息
一、copy
1. copyfileobj(fsrc, fdst, length=16*1024)
文件对象的复制,fsrc和fdst是打开的文件对象,复制内容,fdst要求可写
length指定了表示buffer的大小
import shutil
# shutil.copyfileobj()
with open('D:/test_liujj/test1', 'r+') as f1:
f1.write('abcd\n1234')
f1.flush()
f1.seek(0)
with open('D:/test_liujj/test2', 'w+') as f2:
shutil.copyfileobj(f1,f2)
2. copyfile(src, dst, *, follow_symlinks=True)
复制文件内容,不含元数据,src和dst为文件的路径字符串
目标文件如果有内容,会被清空重新写入
本质上是调用copyfileobj,所以不带元数据二进制内容复制
# copyfile 复制文件
shutil.copyfile('D:/test_liujj/test1','D:/test_liujj/test2')
3. copymode(src, dst, *, follow_symlinks=True)
仅复制权限
# copymode复制权限
shutil.copymode('D:/test_liujj/test1','D:/test_liujj/test2')
4. copystat(src, dst, *, follow_symlinks=True)
复制元数据,stat包含权限
shutil.copystat('D:/test_liujj/test1','D:/test_liujj/test2')
print(os.stat('D:/test_liujj/test1'))
print(os.stat('D:/test_liujj/test2'))
5. copy(src, dst, *, follow_symlinks=True)
复制文件内容、权限和部分元数据,不包括创建时间和修改时间
本质上调用的是
copyfile(src, dst, follow_symlinks=follow_symlinks) copymode(src, dst, follow_symlinks=follow_symlinks)
copy2比copy多了复制全部元数据,但需要平台支持
copy2拷贝的文件的创建时间、修改时间等和源文件一样,copy拷贝的文件的创建时间是新的,和源数据不同。
本质上调用的是
copyfile(src, dst, follow_symlinks=follow_symlinks) copystat(src, dst, follow_symlinks=follow_symlinks)
6. 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('test'),names)
return set(ig)
shutil.copytree('D:/test_liujj/','D:/test/',ignore=ignore)
二、删除
1. rmtree(path, ignore_errors=False, οnerrοr=None)
递归删除,等于rm -rf 慎用
不是原子删除,可能删除错误,就会中断,已经删除的就删除了
ignore_errors=True时,忽略错误,为False或者omitted时onerror生效
onerror为callable,接受函数function、path、execinfo
shutil.rmtree('D:/test/')
三、移动
1. move(src, dst, copy_function=copy2)
递归移动文件、目录到目标,返回目标。
本身使用的是 os.rename方法。
如果不支持rename,如果是目录则想copytree再删除源目录。
默认使用copy2方法。
shutil.move('D:/test_liujj/testpython/a.py','D:/test_liujj')
shutl还有打包功能。生成tar并压缩。支持zip、g2、bz、XZ。