Python shutil模块

Python Shutil

Posted by BlueFat on Friday, August 19, 2022

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

copy复制

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

阅读copyfileobj函数。

copyfileobj(fsrc,fdst[, length])

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

copyfile(src, dst, *, follow_ symlinks=True)

仅仅复制权限

copymode(src, dst, *,  follow_ symlinks=True)

复制元数据,stat包含权限

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)

递归复制目录

默认使用copy2,也就是带更多的元数据复制。 src、dst必须是目录,src必须存在,dst必须不存在ignore = func,提供一个callable(src, names) -> ignored.names。提供一个函数, 它会被调用。src是源目录,names是os.listdir(src)的结果, 就是列出src中的文件名,返回值是要被过滤的文件名的set类型数据。

copytnee(src, dst, symlinks=False, ignore=None, copy_function=copy2,
ignore_dangling_ symlinks=False)

例:不拷贝后缀名为.py和.txt

from pathlib import Path
import shutil
src=Path().cwd().parent/'xiti'
dst=Path().cwd().parent/'test'
shutil.rmtree(dst)
def ignore_name(src,names):
    return set(filter(lambda name: name.endswith('.py') or name.endswith('.txt'),names))
    
shutil.copytree(src,dst,ignore=ignore_name)

重温

def fn(src,names):
    ignore_names=set()
    for name in names:
        print(name,type(name))
        if name.endswith('.py'): #排队.py后缀
            ignore_names.add(name)
    return ignore_names 
    #return {name for name in names if name.endswith('.py') or name.endswith('.txt')}

move移动

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

shutil.move('o:/a''o:/aaa' )
os.rename('o:/t.txt','o:/temp/t' )
os.rename('test3',' /tmp/ py/test300')