导读

shutil模块提供了许多关于文件和文件集合的高级操作,特别是提供了支持文件复制和删除的功能 。
有关单个文件的操作,另请参阅os模块。

参考官方文章:shutil — High-level file operations, Python 2.X 版戳这,Python 3.X 版戳这

目录与文件操作

shutil.copyfile(src, dst, follow_symlinks=True)
功能:将src文件内容复制到dst的文件上。如果dst文件不存在,程序自动创建,如果已存在,则覆盖。
参数:
• src:源文件名称,可包含合法路径
• dst:复制到的目标文件名,可包含合法路径

import shutil
shutil.copyfile('aa.txt', 'cc.txt')
shutil.copyfile('aa.txt', ‘/home/cc.txt')

shutil.copy(src, dst, follow_symlinks=True)
功能:将文件src复制到文件或目录dst。
如果dst为目录,则表示复制文件到该目录下;反之如果是文件,则表示创建指定文件再复制src的数据到该文件上。copy() 仅复制原文件的数据和权限,其它元数据不会保留。需要保留更多的元数据可使用 copy2()。
参数:
• src:源文件名称
• dst:目标路径或文件名

import shutil 
shutil.copy('aa.txt', '/home')
shutil.copy('aa.txt', '/home/aa_backup.txt')

shutil.copy2(src, dst, follow_symlinks=True)
功能:将文件src复制到文件或目录dst。
如果dst为目录,则表示复制文件到该目录下;反之如果是文件,则表示创建指定文件再复制src的数据到该文件上。copy2()会保留所有可用的元数据。如:创建日期、修改日期、属主等。
参数:
• src:源文件名称
• dst:目标路径或文件名

import shutil
shutil.copy2('aa.txt', '/home')
shutil.copy2('aa.txt', '/home/aa_backup.txt')

shutil.copymode(src, dst)
功能:将src权限信息复制至dst,其它内容不变,并要求两者均事先存在。
参数:
• src: 源文件或文件夹
• dst: 将权限复制至dst文件或文件夹
• follow_symlinks:设置为False时,src, dst皆为软连接,可以复制软连接权限,但其默认为True,即当成普通文件复制权限。(Python3.3新增参数)

imort shutil
shutil.copymode('aa.txt', 'bb.txt')    # 将文件 aa.txt 的权限复制至文件 bb.txt
shutil.copymode('dir1', 'dir2')    # 将文件夹 dir1 的权限复制至文件夹 dir2

shutil.copystat(src, dst, follow_symlinks=True)
功能:复制权限位,上次访问时间,上次修改时间以及从src到dst的标志。在Linux上,copystat()还会尽可能复制“扩展属性”。除前面所述外,文件内容,所有者和组不受影响。执行copystat()前,src和dst必须事先存在。
参数:
• src:源文件或文件夹
• dst:目标文件或文件夹
• follow_symlinks:Python 3.3 新增扩展参数

import shutil
#文件夹与文件夹间的 权限、访问时间、修改时间 的数据交换:
shutil.copystat('myredis', 'test')

#文件与文件间的 权限、访问时间、修改时间 的数据交换(除同类型文件外,还可跨文件类型交换)。
shutil.copystat('redis.conf', 'new_redis.conf')

#文件 与 文件夹 间的 权限、访问时间、修改时间 的数据交换。
shutil.copystat('new_redis.conf', 'cache')

ignore_patterns(*patterns)
功能:模式匹配,主要用于配合copytree() 方法使用,copytree()递归复制过程中,如遇到符合本规则的文件或目录将被忽略。
参数:
•patterns:支持完全配合、模糊匹配等规则。多条规则使用,号间隔。

支持形态:

shutil.ignore_patterns('file.txt') # 完全匹配
shutil.ignore_patterns('dir')
shutil.ignore_patterns('file.txt', 'dir')
shutil.ignore_patterns('*.py', 'tmp*') # 模糊匹配

shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False)
功能:递归拷贝目录树,将src文件夹里的所有数据拷贝至dst文件夹。
参数:
• src:源文件夹名称
• dst:复制至的文件夹名称,该文件夹会自动创建,需保证同目录下不存在目标文件夹,否则将报错。
• symlinks:是否复制软连接,True复制,False不复制,软连接会被当成文件复制过来,默认False
• ignore:指定匹配模式,可传入ignore_patterns()
• copy_function:指定拷贝操作的执行函数,默认为copy2(),复制内容时调用 copystat() 方法复制源文件/目录的权限、访问及修改时间。
• ignore_dangling_symlinks:默认为False,在拷贝指向文件已删除的软连接时,程序将报错,如需消除该异常,设为True即可。(Python3新增参数)

from shutil import copytree, ignore_patterns
# 复制 MongoDB 文件夹及其所有内容到 /usr/local 中
shutil.copytree(‘./MongoDB’, ‘/usr/local/MongoDB’)

# 递归复制过程中,忽略名为 a.xlsx 和 b.xlsx 的文件(完全匹配)
copytree(‘MongoDB’, ‘/home/MongoDB’, ignore=ignore_patterns('a.xlsx','b.xlsx'))

# 复制除 .pyc 结尾和 tmp 开头的所有文件(模糊匹配)
copytree(‘MongoDB’, ‘/home/MongoDB’, ignore=ignore_patterns('*.pyc', 'tmp*'))

shutil.move(src, dst, copy_function=copy2)
功能:将 src (文件/目录/目录树)移动到 dst 的目录中,如果dst不存在,且指定移动前与移动后在同级目录的,此时表示重命名。
参数:
• src:源文件名称或文件夹名称
• dst:移动后的目标文件或文件夹夹名称
• copy_function:执行移动操作的函数,默认为 copy2() ,此项为可选项(Python3.5 新增参数)

import shutil
# 重命名 aa.txt 为 cc.txt
shutil.move(‘aa.txt', 'cc.txt') 
# 移动 aa.txt 到 home 目录中
shutil.move(‘aa.txt', ‘/home’) 
# 重命名 aa 文件夹为 bb
shutil.move(‘aa’, ‘bb’)
# 移动 aa 文件夹(含所有数据)到 home 目录中
shutil.move(‘aa’, ‘/home’)

shutil.rmtree(path, ignore_errors=False, onerror=None)
功能:递归删除目录树,清空目录内所有数据。
参数:
• path:目标路径
• ignore_errors:是否忽略错误,默认 False
• onerror:如果 ignore_errors 为 True,则需要定义并传递一个执行处理的函数,该函数需接收 (func,path, exc_info)三个参数。

import shutil
shutil.rmtree('myMongoDB') # 删除 MongoDB 文件夹内的所有数据

shutil.disk_usage(path)
功能:查看给定目录所在的磁盘的使用情况。
参数:
path:盘符或路径

import shutil
shutil.disk_usage('/dev/sda1') # Linux 系统
shutil.disk_usage('C:') # windows 系统

shutil.chown(path, user=None, group=None)
功能:修改指定的文件或文件夹的属主或分组。(Python3新增方法)
参数:
• path:路径或文件名。
• user:属主,目标 user 必须真实存在,且需要有足够的权限,否则将报错。
• group:分组,目标 group 必须真实存在,,且需要有足够的权限,否则将报错。

import shutil
# 单独修改文件属主
shutil.chown('my.txt', user='testuser')
# 单独修改文件群组
shutil.chown('my.txt', group='testgroup')
# 一同修改文件 属主和群组 
shutil.chown('my.txt', user='testuser', group='testgroup')
# 修改文件夹属主和群组
shutil.chown('myMongoDB', user='testuser', group='testgroup')

shutil.which(cmd, mode=os.F_OK | os.X_OK, path=None)
功能:获取给定的 cmd 命令的可执行文件的路径。(Python3新增方法)
参数:
• cmd:系统可执行命令,如:Linux 的 ls、python ;windows 的 calc、ipconfig 等

import shutil
# Linux 平台
shutil.which('python') # 获取 python 程序路径

# windows 平台
shutil.which('calc') # 获取 计算器 程序路径

归档操作(压缩&解压)

shutil 除了提供文件和目录的操作,还提供了用于创建和读取压缩和归档文件的高级实用程序。
其主要依赖于 zipfiletarfile模块。

压缩文件

shutil.get_archive_formats()
功能:获取支持的压缩格式,返回列表
PS:一般支持 zip、tar、gztar、bztar 等格式

import shutil
shutil.get_archive_formats()

shutil.make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0, dry_run=0, owner=None, group=None, logger=None)
功能:文件压缩
参数:
• base_name:压缩后的文件名,不需要指定后缀名,其还可以包含路径信息,如果包含路径,压缩包将存放在指定的路径,否则存档在当前目录。
• format:指定压缩格式,如:tar, zip, bztar, xztar 等
• root_dir:待压缩文件所在目录
• base_dir:压缩起始目录
• owner:属主,默认为当前用户
• group:隶属群组,默认当前组

实例 1:

import shutil
# 将 myMongoDB 目录下的数据以 tar 格式压缩,压缩包名为 MongoDB_Package, 且存放在当前目录
shutil.make_archive('MongoDB_Package', 'tar', root_dir='./myMongoDB')
# 将 myMongoDB 目录下的数据以 tar 格式压缩,压缩包名为 MongoDB_Package, 且存放到根目录下的 home 目录中
shutil.make_archive('/home/MongoDB_Package', 'tar', root_dir='./myMongoDB')

执行后,程序就会根据指定的要求在对应的位置生成对应的压缩文件。
上述这种压缩方式有两个缺点:
(1)无法直接对文件进行压缩
(2)程序会直接对指定目录下的文件进行压缩,如果这个目录的一级目录下有非常多的文件或文件夹,那么在解压的时候这些文件和文件夹就会全部释放到指定目录,这样给人的感觉特别不友好。

鉴于上述的缺点,有没有别的方案呢?
答案是肯定的,设想如果能在压缩文件时,先给数据套上一个文件夹,将所有的数据封装到这个文件夹里,这样在解压时,就是一个独立的文件夹了。

实例 2:

import shutil
# 与上一样,但程序在对 myMongoDB 下的数据封装时,会先套一个文件名为 myMongoDB 文件夹
shutil.make_archive('/home/MongoDB_Package', 'tar', base_dir='./myMongoDB')
# 对单个文件直接压缩
shutil.make_archive('./score_new', 'tar', base_dir='./score.xlsx')

shutil.register_archive_format(name, function[, extra_args[, description]])
功能:注册一个压缩(归档)的格式名称
参数:
• name: 待注册的格式名称
• function: 用于压缩档案的可调用函数。

shutil.unregister_archive_format(name)
功能:取消已有支持存档格式名称。

解压缩文件

shutil.get_unpack_formats()
功能:获取支持的解压格式,返回列表

import shutil
shutil.get_unpack_formats()

shutil.unpack_archive(filename, extract_dir=None, format=None)
功能:解压文件
参数:

• filename:压缩包的名称(可包含路径)。
• extract_dir:解压后文件的存放路径,如果指定路径不存在,则自动创建(默认为当前路径)。
• format:解压格式,默认为None,程序会根据扩展名自动选择解压格式。

import shutil
shutil.unpack_archive('./my.tar', extract_dir='/temp')

说明:解压当前目录下的 my.tar 压缩文件,解压后存放在根目录的 temp 目录下。

shutil.register_unpack_format(name, extensions, function[, extra_args[, description]])
功能:注册一个解包格式
参数:
• name:格式的名称
• extensions:与格式对应的扩展名列表
• function:用于解压缩档案的可调用函数

shutil.unregister_unpack_format(name)
功能:取消注册一个解压格式
• name: 已存在的解压格式名称

最后修改:2021 年 04 月 24 日
如果觉得我的文章对你有用,请随意赞赏