文件的复制和移动

shutil模块

  • 文件拷贝:使用打开2个文件对象,源文件读取内容,写入目标文件中来完成拷贝过程。但是这样丢失stat数据信息(权限等),因为根本没有复制这些信息过去。
copy
  • copyfileobj(fsrc,fdst[,length])
  • 文件对象的复制,fsrc和fdst是open打开的文件对象,复制内容。fdst要求可写。length 指定了表示buffer的大小;
import shutil

with open('f:work/002/test.txt','r+')as f1:
    f1.write('abcd\n123')
    f1.flush()
    f1.seek(0)                                    #注意指针一定要回到0位置.
    with open('f:work/002/test1','w+') as f2:
        shutil.copyfileobj(f1,f2)
  • copyfile(src, dst, *,follow_symlinks=True)复制文件内容,不含元数据。src、dst为文件的路径字符串本质上调用的就是copyfileobj,所以不带元数据二进制内容复制。(拷贝时不想带权限就用copyfile)

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

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

shutil.copymode('test.txt','test1')
os.stat('test.txt')
---------------------------------------------
os.stat_result(st_mode=33206, st_ino=562949953421938, st_dev=3268133497, st_nlink=1, st_uid=0, st_gid=0, st_size=9, st_atime=1556607462, st_mtime=1556607462, st_ctime=1556606623)
os.stat("test1")
---------------------------------------------
os.stat_result(st_mode=33206, st_ino=562949953421940, st_dev=3268133497, st_nlink=1, st_uid=0, st_gid=0, st_size=9, st_atime=1556607469, st_mtime=1556607462, st_ctime=1556606833)
  • copy(src, dst, * , follow_symlinks=True)复制文件内容、权限和部分元数据,不包括创建时间和修改时间。本质上调用的是:

    • 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类型数据。
    import shutil
    shutil.copytree('f:/work/002','f:/work/004')
    
    def ignore(src, names):    
    ig = filter(lambda x: x.startswith('t'), names) # 忽略 t开头的文件和文件夹  
    return set(ig)
    
    shutil.copytree('f:/work/002','f:/work/005',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

shutil.move('f:/work/007','f:/work/008')                  #文件夹移动,目标文件夹存在,则报错,移动后67原文件夹被删除
os.rename('f:/work/005','f:/work/006')                    #文件夹改名
os.rename('f:/work/003/test.txt','f:/work/003/aaa.exe')   #文件改名
move

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

shutil还有打包功能,生成tat并压缩,支持zip,gz,bz,xz.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值