一、shutil是什么?
shutil 是 python 中的高级文件操作模块,与os模块形成互补的关系,os主要提供了文件或文件夹的新建、删除、查看等方法,还提供了对文件以及目录的路径操作。shutil模块提供了移动、复制、 压缩、解压等操作,恰好与os互补,共同一起使用,基本能完成所有文件的操作。是一个非常重要的模块。但是在Windows和 POSIX平台上,文件所有者,ACL以及ADS(供选数据流)不会被复制.
二、使用步骤
1、安装shutil库
pip insatll shutilwhich
2、shutil库的使用
import shutil
3、复制
3.1、shutil.copy(src,dst) ==> 拷贝文件和权限
import shutil
shutil.copy('demo.py','demo2,py') #目标文件无需存在
# copy()复制文件数据和文件许可模式,不保留其他元数据,例如文件的创建时间和修改时间,要保留原始文件中的所有文件元数据,应用copy2()。
# copy()不能用于复制目录。
3.2、shutil.copy2(src,dst) ==> 拷贝文件和状态信息
import shutil
shutil.copy2('demo.py','demo2,py') #dst文件无需存在
#拷贝文件和状态信息
# copy2()尝试将所有元数据从源文件的符号链接复制到新创建的目标文件的符号链接。但是此功能并非在所有平台上都可以用。在某些或所有此功能不可用的平台上,copy2()将保留所有可能的元数据;copy2()永远不会引发异常,因为它无法保留文件元数据。
# copy2()不能用于复制目录
3.3、shutil.copyfile(src,dst,follow_symlinks) ==> 拷贝文件
import shutil
shutil.copyfile('demo.py','demo2.py')
# 将一个文件的内容拷贝到另一个文件中,目标文件无需存在
# src:源文件路径
# dst:复制至dst文件,若dst文件不存在,将会生成一个dst文件;若存在将会被覆盖
# follow_symlinks:设置为True时,若src为软连接,则当成文件复制;如果设置为False,复制软连接。默认为True。
3.4、shutli.copytree(src,det,symlinks=False,ignore=None) ==> 递归的去拷贝文件
import shutil
# shutil.copytree(src, dst, symlinks=False, ignore=None),递归的去拷贝文件夹
shutil.copytree('创建文件夹', '文件', ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
# oripath : "来源路径"
# despath : "目标路径"
# ignore : shutil.ignore_patterns() 是对内容进行忽略筛选,将对应的内容进行忽略。
# 复制文件的权限和时间,如果当前目录存在会引发异常
3.5、shutil.copymode(src, dst) ==> 仅拷贝权限,内容、组、用户均不变
import shutil
shutil.copymode('demo.py','demo2.py')
# 拷贝权限,前提是目标文件存在,不然会报错。将src文件 权限 复制至dst文件。文件内容,所有者和组不受影响
4、移动目录或文件(重命名)
shutil.move(src, dst) ==> 递归的去移动文件
import shutil
shutil.move('demo.py','../练习题')
# 将文件或目录(src)递归移动到另一个位置(dst)并返回目标。
# 如果目标是现有目录,则将src移动到该目录内。如果目标已经存在但不是目录,则可能会根据os.rename()语义将其覆盖。
# 递归的去移动文件,它类似mv命令,其实就是重命名
5、递归删除文件
shutil.rmtree(path[, ignore_errors[, onerror]]) ==> 递归的去删除文件
import shutil
shutil.rmtree('demo2.py')#删除目录,不能删除文件否则报错
# 删除整个目录树;路径必须指向目录(但不能指向目录的符号链接)。如果ignore_errors为true,则删除失败导致的错误将被忽略;如果为false或忽略,则通过调用onerror指定的处理程序来处理此类错误;如果省略,则引发异常
6、更改属主及属组
shutil.chown('path','user','group')
7、查找命令绝对路径
shutil.which('cmd')
8、获取磁盘使用空间
total, used, free = shutil.disk_usage("path")
print("当前磁盘共: %iGB, 已使用: %iGB, 剩余: %iGB"%(total / 1073741824, used / 1073741824, free / 1073741824))
注:默认单位是字节,因此转换为了GB,公式以下:
1KB= 1024字节,1MB= 1024KB,1GB= 1024MB; 因此:1G=1073741824字节。也就是上面为何要除以1073741824操作系统
9、归档和解包
9.1、获取当前系统支持的解包文件格式(后缀)
shutil.get_unpack_formats()
9.2、获取当前系统支持的压缩文件格式(后缀)
shutil.get_archive_formats()
9.3、归档压缩
shutil.make_archive(base_name, format, root_dir=' ', base_dir=None, verbose=0,dry_run=0, owner=None, group=None, logger=None) ==> 打包、压缩
import shutil
shutil.make_archive('./file3/file2/kkk','zip','file1' )
#可指定打包后的文件名
'''
shutil.make_archive(base_name, format, root_dir=' ', base_dir=None, verbose=0,dry_run=0, owner=None, group=None, logger=None)
整个语句的返回值为压缩或打包后的文件的路径+文件名称(文件名称带有相应格式的后缀)
base_name:压缩、打包后的文件名称,也可以是压缩包的路径,如果要保存至指定路径则需要指定路径,此处的文件名称不需加格式后缀,打包或压缩完成后会自动加上
format:压缩或打包的格式,有tar、zip、bztar、gztar
root_dir:打包时切换到的根路径。默认值为当前路径
base_dir:开始打包的路径。也就是说对base_dir所指定的路径进行打包,默认值为 root_dir
owner:用户,默认当前用户
group:组,默认当前组
logger:用于记录日志,通常是logging.Logger对象,可省略
'''
参数解释以下(从左往右开始):code
- base_name: 压缩包的文件名,也能够是压缩包的路径。只是文件名时,则保存至当前目录,不然保存至指定路径。 如:/Users/wupeiqi/www =>保存至/Users/wupeiqi/
- gztar: 压缩包种类,可选值有:“zip”, “tar”, “bztar”,“gztar”
- ./: 要压缩的文件夹路径(默认当前目录)
9.4、解档压缩
shutil.unpack_archive(filename,extract_dir=None,format=None)
# 栗子:
shutil.unpack_archive('test.tar.gz','/opt/tlv')
- filename:文件路径;
- extract_dir:解压至的文件夹路径。文件夹能够不存在,会自动生成;
- format:解压格式,默认为None,会根据扩展名自动选择解压格式。
网友评论