Python shutil标准库文件操作详解

远山来客
远山来客
发布时间:2026-10-13 | 4人浏览过
原创

本文详细介绍Python标准库shutil的高级文件操作功能,涵盖copyfile、copytree、move及rmtree等常用方法。解析参数如follow_symlinks的作用,并讲解make_archive与unpack_archive在压缩归档中的应用,助力高效文件管理。

本文通过具体实例解析Python标准库shutil的使用方法,供读者参考学习。

shutil模块提供了大量针对文件和文件集合的高级操作接口,尤其侧重于支持文件的复制与删除功能。

文件夹与文件操作

copyfileobj(fsrc, fdst, length=16*1024):该函数将fsrc文件的内容复制到fdst文件中。其中,length参数指定了从fsrc每次读取数据的长度,用作缓冲区大小。

  • fsrc:指定源文件对象。
  • fdst:指定目标文件对象,内容将被复制至此。
  • length:指定缓冲区大小,即fsrc每次读取数据的字节长度。
import shutil
f1 = open("file.txt","r")
f2 = open("file_copy.txt","a+")
shutil.copyfileobj(f1,f2,length=1024)

copyfile(src, dst):将src文件的内容直接复制到dst文件中。

  • src:指定源文件的路径。
  • dst:指定目标文件路径。若dst文件不存在,系统会自动创建;若已存在,则会被覆盖。
  • follow_symlinks:Python3新增参数。若设为True,当src为软链接时,将其视为普通文件进行复制;若设为False,则复制软链接本身。默认值为True。
import shutil
shutil.copyfile("file.txt","file_copy.txt")

copymode(src, dst):仅将src文件的权限模式复制到dst文件,不改变文件内容、所有者及所属组。

  • src:指定源文件路径。
  • dst:指定目标文件路径。dst必须是真实存在的路径,且文件必须已存在,否则将抛出文件未找到的错误。
  • follow_symlinks:Python3新增参数。若设为False,且src和dst均为软链接,则复制软链接的权限;若设为True,则将其视为普通文件复制权限。默认值为True。
import shutil
shutil.copymode("file.txt","file_copy.txt")

copystat(src, dst):将src文件的权限、最后访问时间、最后修改时间以及状态标志复制到dst文件。同样,文件内容、所有者及所属组不受影响。

  • src:指定源文件路径。
  • dst:指定目标文件路径。dst必须是真实存在的路径,且文件必须已存在,否则将抛出文件未找到的错误。
  • follow_symlinks:Python3新增参数。若设为False,且src和dst均为软链接,则复制软链接的权限、最后访问时间、最后修改时间及状态标志;若设为True,则视为普通文件复制。默认值为True。
import shutil
shutil.copystat("file.txt","file_copy.txt")

copy(src, dst):将文件src复制到dst。若dst是目录,则在该目录下创建一个与src同名的文件;若该目录下已存在同名文件,将报错提示文件已存在。此操作会一并复制文件权限,其本质是依次调用copyfile和copymode方法。

  • src:指定源文件路径。
  • dst:指定目标文件夹或文件路径。
  • follow_symlinks:Python3新增参数。若设为False,且src和dst均为软链接,则复制软链接权限;若设为True,则视为普通文件复制权限。默认值为True。
improt shutil,os
shutil.copy("file.txt","file_copy.txt")
# 或者
shutil.copy("file.txt",os.path.join(os.getcwd(),"copy"))

copy2(src, dst):将文件src复制到dst。若dst是目录,则在该目录下创建一个与src同名的文件;若该目录下已存在同名文件,将报错提示文件已存在。此操作会一并复制权限、最后访问时间、最后修改时间及状态标志,其本质是依次调用copyfile和copystat方法。

  • src:指定源文件路径。
  • dst:指定目标文件夹或文件路径。
  • follow_symlinks:Python3新增参数。若设为False,且src和dst均为软链接,则复制软链接权限、最后访问时间、最后修改时间及状态标志;若设为True,则视为普通文件复制。默认值为True。
improt shutil,os
shutil.copy2("file.txt","file_copy.txt")
# 或者
shutil.copy2("file.txt",os.path.join(os.getcwd(),"copy"))

ignore_patterns(*patterns):用于定义忽略模式,通常配合copytree()方法使用。传入的文件名将被忽略,不会执行拷贝操作。

  • patterns:指定文件名称的元组。

copytree(src, dst, symlinks=False, ignore=None):递归拷贝目录树,将src文件夹内的所有内容拷贝至dst文件夹。

  • src:指定源文件夹路径。
  • dst:指定目标文件夹路径。该文件夹会自动创建,但必须保证此文件夹不存在,否则将报错。
  • symlinks:指定是否复制软链接。设为True则复制软链接,设为False则不复制(软链接会被当作普通文件复制)。默认值为False。
  • ignore:指定忽略模式,可传入ignore_patterns()函数。
  • copy_function:指定拷贝文件的方式,可传入一个可执行的处理函数,默认值为copy2。此为Python3新增参数。
  • ignore_dangling_symlinks:当symlinks设为False时,若遇到指向已删除文件的软链接,拷贝操作会报错。若希望消除此异常,可将此值设为True。默认值为False,此为Python3新增参数。
import shutil,os
folder1 = os.path.join(os.getcwd(),"aaa")
# bbb与ccc文件夹都可以不存在,会自动创建
folder2 = os.path.join(os.getcwd(),"bbb","ccc")
# 将"abc.txt","bcd.txt"忽略,不复制
shutil.copytree(folder1,folder2,ignore=shutil.ignore_patterns("abc.txt","bcd.txt")

rmtree(path, ignore_errors=False, onerror=None):递归移除目录树,即删除指定的文件夹目录。

  • ignore_errors:指定是否忽略错误,默认值为False。
  • onerror:定义错误处理函数,需传入一个可执行的处理函数。该函数接收三个参数:出错函数、路径和异常信息excinfo。
import shutil,os
folder1 = os.path.join(os.getcwd(),"aaa")
shutil.rmtree(folder1)

move(src, dst):将src移动至dst目录下。若dst目录不存在,效果等同于将src重命名为dst;若dst目录存在,则将src文件夹的所有内容移动至该目录下。

  • src:指定源文件夹或文件路径。
  • dst:指定目标文件夹路径,或将文件重命名为dst文件。若src为文件夹而dst被指定为文件路径,将报错。
  • copy_function:指定拷贝文件的方式,可传入一个可执行的处理函数,默认值为copy2。此为Python3新增参数。
import shutil,os
# 示例一,将src文件夹移动至dst文件夹下面,如果bbb文件夹不存在,则变成了重命名操作
folder1 = os.path.join(os.getcwd(),"aaa")
folder2 = os.path.join(os.getcwd(),"bbb")
shutil.move(folder1, folder2)
# 示例二,将src文件移动至dst文件夹下面,如果bbb文件夹不存在,则变成了重命名操作
file1 = os.path.join(os.getcwd(),"aaa.txt")
folder2 = os.path.join(os.getcwd(),"bbb")
shutil.move(file1, folder2)
# 示例三,将src文件重命名为dst文件(dst文件存在,将会覆盖)
file1 = os.path.join(os.getcwd(),"aaa.txt")
file2 = os.path.join(os.getcwd(),"bbb.txt")
shutil.move(file1, file2)

disk_usage(path):获取当前路径所在硬盘的使用情况。此为Python3新增方法。

  • path:指定文件夹或文件路径。在Windows系统中必须是文件夹路径,在Linux系统中可以是文件路径或文件夹路径。
import shutil.os
path = os.path.join(os.getcwd(),"aaa")
info = shutil.disk_usage(path)
print(info)   # usage(total=95089164288, used=7953104896, free=87136059392)

chown(path, user=None, group=None):修改路径指向的文件或文件夹的所有者或所属组。此为Python3新增方法。

  • path:指定目标路径。
  • user:指定所有者。传递的user值必须是系统中真实存在的用户,否则将报错提示no such user。
  • group:指定所属组。传递的group值必须是系统中真实存在的组,否则将报错提示no such group。
import shutil,os
path = os.path.join(os.getcwd(),"file.txt")
shutil.chown(path,user="root",group="root")

which(cmd, mode=os.F_OK | os.X_OK, path=None):查找给定cmd命令的可执行文件路径。此为Python3新增方法。

import shutil
info = shutil.which("python3")
print(info)   # /usr/bin/python3

归档操作

shutil模块还提供了创建和读取压缩及存档文件的高级接口,其内部实现主要依赖于zipfile和tarfile模块。

make_archive(base_name, format, root_dir, …):用于生成压缩文件。

  • base_name:指定压缩文件的文件名,不允许包含扩展名,因为系统会根据指定的压缩格式自动添加相应的扩展名。
  • format:指定压缩格式。
  • root_dir:指定需要被压缩的文件夹路径。
import shutil,os
base_name = os.path.join(os.getcwd(),"aaa")
format = "zip"
root_dir = os.path.join(os.getcwd(),"aaa")
# 将会root_dir文件夹下的内容进行压缩,生成一个aaa.zip文件
shutil.make_archive(base_name, format, root_dir)

get_archive_formats():获取当前支持的压缩文件格式。目前支持tar、zip、gztar、bztar。在Python3中额外支持xztar格式。

unpack_archive(filename, extract_dir=None, format=None):执行解压操作。此为Python3新增方法。

  • filename:指定待解压的文件路径。
  • extract_dir:指定解压后的目标文件夹路径。该文件夹可以不存在,系统会自动生成。
  • format:指定解压格式,默认值为None,系统会根据文件扩展名自动选择解压格式。
import shutil,os
zip_path = os.path.join(os.getcwd(),"aaa.zip")
extract_dir = os.path.join(os.getcwd(),"aaa")
shutil.unpack_archive(zip_path, extract_dir)

get_unpack_formats():获取当前支持的解压文件格式。目前支持tar、zip、gztar、bztar和xztar。此为Python3新增方法。

关于shutil模块的更多详细信息,可查阅官方文档:https://docs.python.org/3/library/shutil.html

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python文件与目录操作技巧汇总》、《Python文本文件操作技巧汇总》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家进行Python程序设计有所帮助。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表