在一个目录下有两个文件,其中一个文件中写入数据,现在要将这些数据复制到另一个文件中,该如何操作?
方法一: 打开文件读取,然后写入到另一个文件中
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。