Python--shutil模块细说

shutil 模块



前言思考:
文件拷贝:使用打开2个文件对象,源文件读取内容,写入目标文件中来完成拷贝过程。但是这样丢失 stat 数据信息(权限等),因为根本没有复制这些信息过去。

另外一种情况,目录复制又怎么办呢?
Pyhton 提供了一个方便的库 shutil(高级文件操作)

copy 复制


copyfileobj(fsrc,fdst[,length])
文件对象的复制,fsrc 和 fdst 是 open 打开的文件对象,复制内容。fdst 要求可写。

import shutil

with open('f:/test','r+') as f1:
	f1.write('abc123xyz')
	f1.flush()
	with open('f:/test2','w+') as f2:
		shutil.copyfileobj(f1,f2)

上面的代码执行之后,f2 文件为空文件,原因就是 f1 文件在写入之后指针指向了文本末尾,这时候复制并不会复制到任何东西,所以:

with open('f:/test','r+') as f1:
    f1.write('abc123xyz')
    f1.seek(0)
    f1.flush()
   	with open('f:/test2','w+') as f2:
		shutil.copyfileobj(f1,f2)

这样就可以复制到内容了。


copyfile(src,dst,*,follow_symlinks=True)
复制文件内容,不含元数据。src、dst为文件的路径字符串
本质上调用的就是 copyfileobj,所以不带元数据二进制内容复制。


cpoymode(src,dst,*,follow_symlinks=True)
仅仅复制权限

shutil.copymode('test1','test2')

os.stat('test1')
os.stat_result(st_mode=33204,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=150869-177)

os.stat('test2')
os.stat_result(st_mode=33204,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=150869-177)

copystat(src,dst,*,follow_symlinks=True)
复制元数据,stat 包含权限


copy(src,dst,*,follow_symlinks=Ture)
复制文件内容、权限和部分元数据,不包括创建时间和修改时间。
本质上调用的是
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 类型数据。

# f:/test 下有 a,b 目录
def ignore(src, names):
	ig = filter(lambda x: x.statswith('a'),names) #忽略 a 开头的
	return set(ig)

shutil.copytree('f:/test','f:/tt',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。


move 移动

move(src,dst,copy_function=copy2)
递归移动文件、目录到目标,返回目标。
本身使用的是 os.rename 方法。
如果不支持 rename,如果是目录则 copytree 再删除源目录。
默认使用 copy2 方法。

os.rename('f:/test.txt','f:/temp/t')
os.rename('test3','/temp/py/test300')

shutil 还有打包功能,生成 tar 并压缩。支持 zip、gz、bz、xz。

Archiving operations

3.2新本功能,在 3.5 版更改:Added support for the xztar format.
还提供了用于创建和读取压缩文件和存档文件的高级实用程序。它们依赖于zipfile和tarfile模块
shutil.make_archive(base_name,format[,root_dir[,base_dir[,verbose[,dry_run[,owner[,group[,logger]]]]]]])

创建存档文件(如zip或tar)并返回其名称。

基名称是要创建的文件的名称,包括路径,减去任何特定于格式的扩展名。格式是存档格式:“Zip”(如果zlib模块可用)、“tar”、“gztar”(如果zlib模块可用)、“bztar”(如果bz2模块可用)或“xztar”(如果lzma模块可用)

root_dir 是存档文件的根目录;例如,我们通常在创建归档文件之前将目录转换为 root_dir。
base_dir 是我们开始存档的目录;也就是说,base_dir 将是存档文件中所有文件和目录的通用前缀。
root_dirbase dir都默认为当前目录。
如果 dry_run 为真,则不创建存档,但会将执行的操作记录记录到 logger 中。
ownergroup,为当创建一个 tar 存档时的所属主所属组。默认情况下,使用当前的 ownergroup

logger 必须是与PEP 282兼容的对象。通常是 logging.Logger. 的一个实例。

冗长的措词是不使用和不赞成的。

详见shutil—High-level file operations


以上…

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值