文件拷贝:使用打开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')