高级文件操作模块(High-level file operations)
下面粗略的介绍他的一些常用功能
文件对象的复制, 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大小的内容写入目标文件。
复制文件内容,不含元数据。src和dst为文件的路径字符串
本质上调用的是copyfileobj,所以不带元数据二进制内容复制。
仅仅复制权限。
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)
复制元数据,stat包括权限
复制文件内容、权限和部分元数据,不包括创建时间和修改时间。
查看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
复制文件内容、权限和全部元数据,但需要平台支持。
查看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
结合copytree源码分析:
# 自定义一个ignore函数,可以忽略a开头的文件
# names是os.listdir(src)返回的列表
# src是源文件
def ignore(src,names):
return set(filter(lambda x: x.startswith("a"), names))
shutil.rmtree('O:/tmp') # 类似 rm -rf,慎重
递归移动文件、目录到目标,返回目标。
本身使用的是os.rename方法。
如果不支持rename,如果是目录则copytree在删除源目。
默认使用copy2方法。
shutil还有打包功能。生成tar并压缩。支持zip、gz、bz、xz等