Python的shutil模块解析

这篇具有很好参考价值的文章主要介绍了Python的shutil模块解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一、文件复制

1. shutil.copy(src, dst)

2. shutil.copyfile(src, dst)

3. shutil.copy2(src, dst)

4. shutil.copyfileobj(fsrc, fdst,[length=*])

5. shutil.copymode(src, dst)

6. shutil.copystat(src, dst)

7. shutil.copytree(src, dst,ignore=none,copy_function=shutil.copy2)

二、文件移动和删除

1. shutil.move(src,dst)

2. shutil.rmtree(src)

三、文件压缩和解压缩

 1. shutil.make_archive(base_name,format,dir)

2. shutil.unpack_archive(filename,extract_dir=None, format=None)

总结


 文章来源地址https://www.toymoban.com/news/detail-495716.html

前言

Python的Shutil模块可以看做是OS模块的补充,它提供了对文件(夹)复制,移动,删除,压缩和解压缩的方法。下面本文会对shutil模块的常用方法进行分类介绍。

一、文件复制

shutil模块提供了多种文件复制方法,主要方法如下表:

1. shutil.copy(src, dst)

  • src为源文件路径(必须是文件),dst为目标文件路径(文件名可加可不加)
  • 目标文件如存在会覆盖掉,不存在会创建新文件,包括路径
  • 只copy内容和权限,其他文件属性如时间没有copy,注意权限是copy了
  • 返回值为目标文件路径

代码示例如下:

>>> shutil.copy('../class.py','./') #复制文件到当前目录,注意dst为目标路径
'./class.py'
>>> os.listdir('./') #列出当前目录的文件名信息,class.py已创建
['test3', 'class.py', 'test2', 'function.py', 'function1.py', 'test1']
>>> shutil.copy('../class.py','./class2.py') #复制文件并重命名,注意dst为文件名
'./class2.py'
>>> os.listdir('./') #列出当前目录的文件名信息,class2.py已创建
['test3', 'class.py', 'test2', 'function.py', 'class2.py', 'function1.py', 'test1']

 

2. shutil.copyfile(src, dst)

  • src为源文件路径(必须是文件),dst为目标文件路径,且必须包含文件名
  • 目标路径不存在会报错
  • 返回值为目标文件路径

代码示例如下:

>>> shutil.copyfile('../class.py','./class2.py') #用copyfile复制文件
'./class2.py'
>>> shutil.copyfile('../class.py','./os/class2.py') #目标文件的目录不存在会报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/shutil.py", line 121, in copyfile
    with open(dst, 'wb') as fdst:
FileNotFoundError: [Errno 2] No such file or directory: './os/class2.py'
>>> shutil.copyfile('../class.py','./') #dst不是文件而是目录会报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/shutil.py", line 121, in copyfile
    with open(dst, 'wb') as fdst:
IsADirectoryError: [Errno 21] Is a directory: './'

 

3. shutil.copy2(src, dst)

  • src为源文件路径,dst为目标文件路径
  • 同时复制源文件的内容和stat信息(包含用户,组,权限,时间信息等)
  • 返回值为目标文件路径

shutil.copy2()和shutil.copy()的用法很类似,不同点是shutil.copy2()不仅copy了源文件内容,同时copy了源文件的文件属性,包括修改/访问时间(创建时间貌似无法复制),权限等信息。shutil.copy2()相同于同时做了shutil.copy()和shutil.copystat(),因此该方法名字这里的copy2可以简单记忆成2次copy。

下面是代码举例:

>>> shutil.copy('../class.py','./class2.py') #用copy来复制文件
'./class2.py'
>>> time.ctime(os.stat('../class.py').st_mtime) #返回源文件修改时间
'Sat Jun  8 17:30:32 2019'
>>> time.ctime(os.stat('./class2.py').st_mtime) #返回目标文件修改时间,和源文件不一样
'Sun Sep 18 10:20:36 2022'
>>> shutil.copy2('../class.py','./class3.py') #用copy2来复制文件
'./class3.py'
>>> time.ctime(os.stat('./class3.py').st_mtime) #返回目标文件修改时间,和源文件一样
'Sat Jun  8 17:30:32 2019'

 

4. shutil.copyfileobj(fsrc, fdst,[length=*])

  • fsrc为源文件句柄,fdst为目标文件句柄,length为copy内容大小
  • 源文件和目标文件必须是已经打开的文件句柄
  • 没有返回值

shutil.copyfileobj()方法可以copy一个打开的文件到另一个打开的文件,注意源文件和目标文件参数均是文件句柄对象。

代码示例如下:

>>> file1=open('hr.py','r') #打开源文件
>>> file2=open('hr1.py','w') #打开目标文件
>>> shutil.copyfileobj(file1,file2) #文件复制,注意没有返回值

 

5. shutil.copymode(src, dst)

  • src为源文件路径,dst为目标文件路径,可以是文件或者目录
  • 目标文件必须已经存在,只复制权限信息,不复制内容,时间,用户和组等信息
  • 返回值为目标文件路径

shutil.copymode()只会复制文件权限(st_mode信息),不会复制内容和其他属性。

代码示例如下:

>>> os.system('chmod 777  ../class.py') #用shell指令将源文件的读写属性改变
0
>>> os.system('ls -l ../class.py') #打印源文件的属性为-rwxrwxrwx
-rwxrwxrwx 1 user user 527 6月   8  2019 ../class.py
0
>>> shutil.copyfile('../class.py','./class4.py') #用copyfile来复制文件
'./class4.py'
>>> os.system('ls -l ./class4.py') #打印目标文件属性为-rw-r--r--,和源文件不一样
-rw-r--r-- 1 user user 527 9月  18 10:40 ./class4.py
0
>>> shutil.copymode('../class.py','./class4.py')#用copymode来复制文件权限
>>> os.system('ls -l ./class4.py') #打印目标文件属性为-rwxrwxrwx,和源文件一样
-rwxrwxrwx 1 user user 527 9月  18 10:40 ./class4.py
0

 

6. shutil.copystat(src, dst)

  • src为源文件路径,dst为目标文件路径,可以是文件或者目录
  • 目标文件必须已经存在,只复制stat信息,包含权限,时间,组,用户等,不复制内容
  • 返回值为目标文件路径

shutil.copystat()相比shutil.mode(),同样也不复制内容,不同的是它除了复制权限信息,其他stat信息包括修改时间等也按同样复制。

代码示例如下:

>>> shutil.copyfile('../class.py','./class5.py') #复制文件
'./class5.py'
>>> os.system('ls -l ../class.py') #打印源文件信息
-rwxrwxrwx 1 user user 527 6月   8  2019 ../class.py
0
>>> os.system('ls -l ./class5.py') #打印目标文件信息,权限和时间和源文件不一样
-rw-r--r-- 1 user user 527 9月  18 10:48 ./class5.py
0
>>> shutil.copystat('../class.py','./class5.py') #复制文件stat到目标文件
>>> os.system('ls -l ./class5.py') #打印目标文件信息,权限和时间和源文件一样
-rwxrwxrwx 1 user user 527 6月   8  2019 ./class5.py
0

 

7. shutil.copytree(src, dst,ignore=none,copy_function=shutil.copy2)

  • src为源路径,dst为目标路径,目标路径必须不存在
  • ignore必须是一个可调用对象,shutil.copytree()每次递归访问文件夹时,会将当前目录和目录的os.listdir()作为参数调用一次ignore,该可调用对象必须返回一个相对于当前目录的目录和文件 名序列(即其第二个参数的子集);随后这些名称将在拷贝进程中被忽略。如ignore=shutil.ignore_patterns('*.py'),代表以.py结尾的文件或者文件夹都不会复制。
  • copy_function可以选择shutil.copy2或者shutil.copy模式进行copy,默认是shutil.copy2
  • 返回值为目标文件路径

shutil.copytree()会递归复制以src为根起点的整个目录树到名为dst的目录并返回目标目录,注意src必须是目录,dst必须不能已存在。如果复制过程中需要忽略某些文件可以使用ignore参数,注意ignore后面需要接可调用对象,该对象可以是一个自定义的函数,函数的参数有2个,当前目录,和当前目录的os.listdir(),函数返回的是需要ignore的文件名。该函数也可以用shutil自带的shutil.ignore_patterns('*patterns')

代码示例如下:

>>> shutil.copytree('/home/user/Python','/home/user/Python1',ignore=None,copy_function=shutil.copy)
'/home/user/Python1'
>>> os.listdir('/home/cfzhu/Python1') #列出copy后的文件夹中的文件
['dictionary.py', 'abnormal.py', 'aa.json', '.file.py.swp', '.print.py.swp', 'hello.py', 'class.py', 'input.py', 'function.py', 'shutil', '.abnormal.py.swo', 'os', 'file.py', 'file2', 'print.py', 'file1', '__pycache__', 'import.py', '.abnormal.py.swp', 'file3', 'hr.py', 'tk.py', 'aa1.json']
>>> shutil.copytree('/home/user/Python','/home/user/Python2',ignore=shutil.ignore_patterns('*.py'),copy_function=shutil.copy2)
'/home/user/Python2'
>>> os.listdir('/home/user/Python2') #copy后的文件名没有"*py"结尾的文件
['aa.json', '.file.py.swp', '.print.py.swp', 'shutil', '.abnormal.py.swo', 'os', 'file2', 'file1', '__pycache__', '.abnormal.py.swp', 'file3', 'aa1.json']

 

二、文件移动和删除

1. shutil.move(src,dst)

  • src为源文件路径,dst为目标文件路径,两者都可以是文件或者目录
  • 返回值为目标文件路径

代码如下(示例):

>>> shutil.move('hr.py','hr1.py') #移动文件
'hr1.py'
>>> shutil.move('./shutil','./shutil1') #移动文件夹
'./shutil1'

2. shutil.rmtree(src)

  • src为源文件路径
  • 没有返回值

shutil模块中的rmtree()可以递归彻底删除非空文件夹,需要慎重使用

代码如下:

>>> os.listdir()
['.bashrc', 'Python2', '.cache', 'Python1', 'hr_py']
>>> shutil.rmtree('./Python2/') #递归删除文件夹的所有内容
>>> os.listdir() #文件夹已删除
[.bashrc', '.cache', 'Python1', 'hr_py']

三、文件压缩和解压缩

 1. shutil.make_archive(base_name,format,dir)

  • base_name为源文件路径
  • format为压缩格式,可以是"zip", "tar", "gztar","bztar", or "xztar"
  • dir为压缩后的文件路径
  • 返回压缩后文件路径

shutil.make_archive()可以将文件或者文件夹进行压缩,压缩格式可选,注意压缩源文件并不会删除源文件。

代码如下(示例):

>>> os.listdir()
['shutil1', 'hr2.py', 'function.py']
>>> shutil.make_archive('./shutil1','zip','./') #压缩文件为zip格式
'/home/cfzhu/Python/shutil1.zip'

2. shutil.unpack_archive(filename,extract_dir=None, format=None)

  • filename为源文件路径
  • extract_dir为提取后的路径,默认当前路径
  • format为压缩格式,可以是"zip", "tar", "gztar","bztar", or "xztar",不指定默认为根据源文件后缀
  • 返回压缩后文件路径

shutil.unpack_archive()可以将压缩文件解压缩。

代码如下(示例):

>>> shutil.unpack_archive('./shutil1.zip','./shutil2') #解压缩
>>> os.listdir()
['shutil1', 'dictionary.py', 'shutil2', 'abnormal.py', 'aa.json', '.file.py.swp', '.print.py.swp', 'shutil1.zip', ]

 


总结

以上就是shutil的常见方法的介绍,包含了文件复制,文件移动和删除以及文件压缩和解压缩三大部分。文中每个方法都提供了实例演示,希望能对大家有所帮助。

 

 

到了这里,关于Python的shutil模块解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【100天精通python】Day20:文件及目录操作_os模块和os.psth模块, 文件路径拼接,目录操作

    目录 专栏导读  1 文件的目录操作  os模块的一些操作目录函数​编辑

    2024年02月14日
    浏览(52)
  • Python 程序设计入门(025)—— 使用 os 模块操作文件与目录

    Python 内置了 os 模块及其子模块 os.path,用于对目录或文件进行操作。在使用 os 模块及其子模块 os.path 模块时,需要使用 import 导入该模块,才能使用它们提供的函数或方法。 1、os 模块提供的操作目录的函数 os 模块提供的操作目录的函数如下表所示: 函数 说明 getcwd() 返回当

    2024年02月11日
    浏览(59)
  • 【python模块】python解析json文件详解

    JSON(Java Script Object Notation)是一种通常用于以不会“对系统造成负担”的方式传输数据(主要通过 API)的格式。基本原理是利用文本来记录数据点,并将数据点传输给第三方。 JSON是一种使用文本存储数据对象的格式。换句话说,它是一种数据结构,将对象用 文本形式 表示出

    2024年02月08日
    浏览(43)
  • cp命令 复制多个目录/文件夹下文件到指定目录

    可以使用cp命令的通配符和递归选项来复制多个目录下多个文件夹下的文件到指定目录。 如果目标目录不存在,可以使用 mkdir -p命令来创建目录。 -p 选项表示递归创建目录,如果目录已经存在,则不会报错。 例如,以下命令会复制 /path/to/dir1和 /path/to/dir2 下的所有子目录中的

    2024年02月12日
    浏览(75)
  • cp 命令 – 复制文件或目录

    cp 命令用于将一个或多个文件或目录复制到指定位置,亦常用于文件的备份工作。-r 参数用于递归操作,复制目录时若忘记加则会直接报错,而 -f 参数则用于当目标文件已存在时会询问,输入 y 确定覆盖,这两个参数尤为常用。 目录 一、语法格式 二、常用参数 三、命令实

    2024年02月11日
    浏览(61)
  • cp命令 – 复制文件或目录

    cp命令是英文单词copy的缩写,用于将一个或多个文件/目录复制到指定位置,也常用于文件的备份工作。 注意:该命令不能用于跨主机文件复制,仅用于同一主机内的文件复制。 该命令的语法格式如下 常用选项如下所示: 选项 作用 -f 若目标文件已存在,则强行覆盖原文件

    2024年02月06日
    浏览(71)
  • java 把文件从一个目录复制到另一个目录。

    方法一:简单粗暴,直接使用copy(),如果目标存在,先使用delete()删除,再复制; 方法二:使用输入输出流。(代码注释部分)

    2024年02月12日
    浏览(51)
  • Linux cp命令:复制文件和目录

    cp 命令,主要用来复制文件和目录,同时借助某些选项,还可以实现复制整个目录,以及比对两文件的新旧而予以升级等功能。 cp 命令的基本格式如下: 选项: -a:相当于 -d、-p、-r 选项的集合,这几个选项我们一一介绍; -d:如果源文件为软链接(对硬链接无效),则复制

    2024年02月06日
    浏览(66)
  • java将指定目录下的文件复制到目标文件夹

    递归是一种基于函数调用自身的方法。它是一种非常常见的计算机编程技术,可以让程序员通过简单、优雅的方式来解决许多问题。 简单来说,递归是在函数执行过程中调用自身的过程。当函数被调用时,它会先执行函数体内的语句,然后再调用自己,这个过程将会重复执行

    2024年02月04日
    浏览(66)
  • 掌握终端基础技巧:Linux下的文件和目录复制操作

    在Linux系统中,命令行终端是一个大而高效的工具,让使用者可以通过简单的命令完成各种任务。其中,文件和目录的复制操作是日常使用频率较高的一项操作。本文将介绍Linux下的文件和目录复制基础技巧,帮助您更好地掌握命令行终端的使用。 一、复制文件: 1.cp命令:

    2024年02月08日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包