1. copy复制
copyfileobj(fsrc, fdst[, length])文件对象的复制,fsrt 和fdst是open打开色文件对象,复制内容,fdst要求可写。length指定了表示buffer的大小。
copyfile(src, dst, *, follow_symlinks=True),复制文件内容不含元数据,src、dst为文件的路径字符串,本质上调用的是copyfileobj,所以不带元数据二进制内容复制。
copymode(src, dst, *, follow_symlinks=True),仅仅复制权限。
copystat(src, dst, *, follow_symlinks=True)复制元数据,stat包含权限。
copy(src, dst, *, follow_symlinks=True),复制文件内容、权限、部分元数据,不包括创建时间和修改时间。本质上调用的是copyfile(src, dst, *, follow_symlinks=True),copymode(src, dst, *, follow_symlinks=True)
copy2(src, dst, *, follow_symlinks=True),比copy多了复制全部元数据,但需要平台支持。本质上调用的是copyfile(src, dst, *, follow_symlinks=True),copystat(src, dst, *, follow_symlinks=True)。
copytree(src, dst, *, follow_symlinks=False, ignore=None, copy_function=copy2)
递归复制目录,默认使用copy2,也就是带更多的元数据复制。src和dst必须是目录,src必须存在,dst必须不存在。
# shutil模块
import shutil
from pathlib import Path
with open('C:/Users/administrator/test.txt', 'r+') as f1: # w+模式写入文件后,文件指针在EOF
f1.write('abcde\n12345') # 文件复制最好用二进制模式,不需要考虑编码问题
f1.flush()
f1.seek(0) # 如果没有此语句,f1.read读取的内容为空,所以f2中没有任何内容
with open('C:/Users/administrator/test1.txt', 'w+') as f2:
# f2.write(f1.read())
shutil.copyfileobj(f1, f2)
shutil.copyfile('C:/Users/administrator/test.txt', 'C:/Users/administrator/test1.txt')
# copyfile的问题是,只是复制了内容,并没有复制权限
# copymode仅仅是复制权限
shutil.copy('C:/Users/administrator/test.txt', 'C:/Users/administrator/test1.txt')
p1 = Path('c:/a/b/c/d/e.zip')
p1.parent.mkdir(parents=True, exist_ok=True)
with p1.open('w+') as f:
f.write('abcd\n1234')
def ignore(names, src):
# s = set()
# for name in names:
# if names.startswith('e'):
# s.add(name)
# return s
# return {name for name in names if names.startswith('e')}
return set(filter(lambda x: x.startswith('e'), names)) # 这个返回值是惰性的,应该学习源码,转换成set
# shutil.copytree('c:/a', 'c:/dest', ignore=ignore, copy_function=shutil.copy)
shutil.move('c:/a/b', 'c:/a/t')
shutil.rmtree('c:/dest')
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)
递归移动文件、目录到目标,返回目标。
本身使用的是os.rename方法。
如果不支持rename,如果是目录则copytree再删除源目录。
默认使用copy2方法。