python学习之 --- shutil模块复制+copy+copytree+rm删除

shutil模块

在一个目录下有两个文件,其中一个文件中写入数据,现在要将这些数据复制到另一个文件中,该如何操作?

方法一: 打开文件读取,然后写入到另一个文件中

import  shutil
from pathlib import Path
p1 = Path('C:/Users/Administrator/tmp/')
with open('C:/Users/Administrator/tmp/test01','w+')as f1 :
	f1.write('abcde\n1234')
	f1.seek(0)  # 写完指针会回到EOF,所以要手动调整指针
	f1.flush()
	with open('C:/Users/Administrator/tmp/test02','w+') as f2:
		f2.write(f1.read())

Python提供了一个方便的库shutil(高级文件操作)

方法二: 用shutil下的copyfileobj

with open('C:/Users/Administrator/tmp/test01','w+')as f1 :
	f1.write('abcde\n12345')
	f1.flush()
	f1.seek(0)
	with open('C:/Users/Administrator/tmp/test02','w+') as f2:
		shutil.copyfileobj(f1,f2)

方法三:copyfile方法

shutil.copyfile(oldpath,newpath)

上面的复制只是单纯的把文件进行了复制,但是文件的权限,文件创建的时间等信息并没有进行复制,所以在复制过程中该如何操作?

带权限复制

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

复制元数据和相关时间等信息,包含权限

copystat(src, dst, *, follow_symlinks=True)

复制文件内容、权限和部分元数据,不包括创建时间和修改时间

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类型数据。

利用copytree 进行复制过滤举例:

from pathlib import Path
import shutil
p1= Path('o:/a/b/c/d/e.txt')
p1.parent.mkdir(parents=True,exist_ok=True)
with p1.open('w+')as f :
    f.write('abcd\n1234')
def ignore (src,names):
    set = {}
    # 'o:/a,['b','c']
    #方法一:for  循环 方式
    # for name in names:
    #     if not name.startwith('a'):#  除去已'a'开头的文件
    #         s.add(name)
    #
    # return s
    #方法二 set 解析式
    return {name for name in names if name.startswith('a')}
#方法三 filter 函数
    # return set(filter(lambda x :x.startwith('a'),names))  # 使用filter进行过滤
shutil.copytree('o:/a','o:/dest',copy_function=shutil.copy,ignore=ignore)
# 利用copytree 进行复制过滤.

rm 删除

shutil.rmtree(path, ignore_errors=False, onerror=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方法。

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

猜你喜欢

转载自blog.csdn.net/qq_40498551/article/details/89873816