Python--shutil模块(目录复制)

本文介绍了Python的shutil模块,该模块可进行高级文件操作。涵盖了文件和目录的复制、删除、移动等功能,如copyfileobj用于文件对象复制,copytree可递归复制目录,shutil.rmtree能递归删除,move可递归移动文件或目录,此外该模块还有打包功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shutil模块

  • 文件拷贝:使用打开2个文件对象,源文件读取内容,写入目标文件中来完成拷贝过程。但是这样丢失stat数据信息(权限等),因为根本没有复制这些信息过去
  • 如何目录复制,Python提供了一个方便的库shutil(高级文件操作)

copy复制

copyfileobj(fsrc, fdst[, length])

  • 文件对象的复制,fsrc和fdst是open打开的文件对象,复制内容。fdst要求可写,length指定了表示buffer的大小
import shutil

with open('/etc/test', 'r+') as f1:
	f1.write('abcd\n1234')
	f1.flush()
	f1.seek(0) # 指针回0
	with open('/etc/test1', 'w+') as f2:
			shutil.copyfileobj(f1,f2) 
copyfileobj源码
def copygileobj(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)

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=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类型数据
# /etc/temp下有a、b目录
def ignore(src, names):
	ig = filter(lambda x: x.startswith('a'), names) # 忽略a开头的
	return set(ig)

shutil.copytree('/etc/temp', '/etc/python/o', 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.rmtree('/etc/bin') # 类似 rm -rf

move 移动

move(src, dst, copy_function=copy2)

  • 递归移动文件、目录到目标,返回目标
  • 本身使用的是 os.rename方法
  • 如果不支持rename,如果是目录则copytree再删除源目录
  • 默认使用copy2方法
os.rename('/etc/bin/t.txt', '/etc/temp/t')
os.rename('test3', '/etc/temp/test300')
  • shutil还有打包功能。生成tar并亚索。支持zip、gz、bz、xz
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值