shutil模块
copy复制
copyfileobj(fsrc, fdst[, length])
- 文件对象的复制, fsrc和fdst是open打开的文件对象, 复制内容, fdst要求可写
- length 指定了buffer的大小
源码如下:
def copyfileobj(fsrc, fdst, length=16*1024):
while 1:
buf = fsrc.read(length) # 从fsrc读取文件
if not buf: # 如果为空, 就break
break
fdst.write(buf) # 读取的文件写入fdst
copyfile(src, dst, *, follow_symlinks=True)
- 复制文件内容,不含元数据。src、dst为文件的路径字符串
- 本质上调用的就是copyfileobj,所以不带元数据二进制内容复制。
源码如下:
def copyfile(src, dst, *, follow_symlinks=True):
if _samefile(src, dst): # 判断是否文件相同
raise SameFileError("{!r} and {!r} are the same file".format(src, dst))
for fn in [src, dst]:
try:
st = os.stat(fn)
except OSError:
# File most likely does not exist
pass
else:
# XXX What about other special files? (sockets, devices...)
if stat.S_ISFIFO(st.st_mode):
raise SpecialFileError("`%s` is a named pipe" % fn)
if not follow_symlinks and os.path.islink(src):
os.symlink(os.readlink(src), dst)
else:
with open(src, 'rb') as fsrc:
with open(dst, 'wb') as fdst:
copyfileobj(fsrc, fdst) # 调用copyfileobj
return dst
copymode(src, dst, *, follow_symlinks=True) 仅仅复制权限
copystat(src, dst, *, follow_symlinks=True) 复制元数据,stat包含权限
copy(src, dst, *, follow_symlinks=True)
复制文件内容、权限和部分元数据,不包括创建时间和修改时间。
本质上调用的是:
copyfile(src,dst,follow_symlinks=follow_symlinks)
copymode(src,dst,follow_symlinks=follow_symlinks)
源码如下:
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
copy2比copy多了复制全部元数据,但需要平台支持。
本质上调用的是:
copyfile(src, dst, follow_symlinks=follow_symlinks)
copystat(src, dst, follow_symlinks=follow_symlinks)
源码如下:
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
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类型数据。
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)
- 递归移动文件、目录到目标,返回目标。
- 默认使用copy2方法。