python专题shutil高阶文件操作
一 前言
如果读者读过知识追寻者其它文件相关专题操作,再来学习这篇高阶文件操作会让你的文件知识瞬间高涨一台阶;本篇文章有些函数作用给知识追寻中感觉是用来伪造信息的,相信如果做网络渗透的读者应该很喜欢这些操作;这本文件读者不仅可以学到文件的移动,复制,删除,还能对文件的元数据进行操作;shutil模块还支持归档操作,这不是本文的重点,详细可以参见官网,如果有空,知识追寻者以后会做这方面的研究学习;随手点赞谢谢;
公众号:知识追寻者
知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)
二 shutil 常用函数介绍
函数名称 | 函数介绍 |
---|---|
shutil.copyfileobj(fsrc, fdst[, length]) | 从源文件拷贝数据到目标文件;如果给定长度length,只会拷贝对应长度字节的数据;如果文件起始位置不为0,只会拷贝文件起始位置position至end部分内容。如果length为负数不会对数据进行分块循环引用处理(慎用)。 |
shutil.copyfile(src,dst*, follow_symlinks=True) | 将源文件拷贝至目标文件(不包括元数据),返回目标文件路径;如果源文件是符号链接文件,follow_symlinks未设置,则会创建新的符号链接文件; |
shutil.copymode(src,dst, *, follow_symlinks=True) | 复制源文件的权限到目标文件;不会影响文件的属主,属组,和文件内容;如果源文件和目标文件都是符号链接文件,follow_symlinks设置为False,会对目标文件的模式进行尝试修改;并非每个平台都可以使用此函数; |
shutil.copystat(src, dst, *, follow_symlinks=True) | 复制文件的权限,上次进入文件时间,上次修改文件时间,标志位到目标文件;不会影响文件的属主,属组,和文件内容 |
shutil.copy(src, dst, *, follow_symlinks=True) | 复制源文件到目标文件;如果目标文件是个目录,已源文件的基本名为基准进行复制;不包括拷贝所有元数据信息; |
shutil.copy2(src, dst, *, follow_symlinks=True) | 与copy功能类似,会尝试 拷贝所有元数据信息 |
shutil.ignore_patterns(**patterns*) | 模式匹配,用于copytree函数ignore属性进行回调处理; |
shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False) | 将源目录下所有文件拷贝至目标目录,并返回目标目录;ignore可以进行模式匹配;copy_function可以指定复制的函数;dirs_exist_ok如果开启,目标目录或者丢失的父目标如果存在就会发生异常; |
shutil.rmtree(path, ignore_errors=False, onerror=None) | 删除整个目录;ignore_errors设置为true,移除文件发生异常时会被忽略;如果设置为false,或者省略,异常交给onerror 处理; |
shutil.move(src, dst, copy_function=copy2) | 递归移动源文件或者目录至目标目录; |
shutil.disk_usage(path) | 返回给定路径的磁盘统计;以元组新式返回total,free,used; |
shutil.chown(path, user=None, group=None) | 改变文件属主,属组;unix平台,可以参照os.chown 函数不做详细介绍 |
三 shutil 函数使用示例
3.1copyfileobj
- 在source文件夹下创建zszxz.txt,指定源文件路径为sour_path
- 指定目的文件名路径tar_path
- 执行copyfileobj方法,将源文件对象复制到目的文件对象
# -*- coding: utf-8 -*-
import shutil
""" 复制文件 """
sour_path = r'C:\test\source\zszxz.txt'
tar_path = r'C:\test\target\new_zszxz.txt'
result = shutil.copyfileobj(open(sour_path,'r',encoding='utf=8') , open(tar_path,'w',encoding='utf=8') )
3.2copyfile
- 将sour_path文件拷贝至tar_path
- 打印返回路径result
# -*- coding: utf-8 -*-
import shutil
sour_path = r'C:\test\source\zszxz.txt'
tar_path = r'C:\test\target\new_zszxz.txt'
result = shutil.copyfile(sour_path, tar_path)
print(result)
输出:
C:\test\target\new_zszxz.txt
3.3copymode
- 源文件与,目标文件当已存在
- 仅拷贝源文件sour_path的权限至目标文件tar_path
# -*- coding: utf-8 -*-
import shutil
sour_path = r'C:\test\source\zszxz.txt'
tar_path = r'C:\test\target\new_zszxz.txt'
shutil.copymode(sour_path, tar_path)
3.4 copystat
- 拷贝sour_path文件的权限,上次进入文件时间,上次修改文件时间,标志位至目标文件tar_path
- 不影响文件的内容,属主,数组;
# -*- coding: utf-8 -*-
import shutil
sour_path = r'C:\test\source\zszxz.txt'
tar_path = r'C:\test\target\new_zszxz.txt'
shutil.copystat(sour_path, tar_path)
3.5 copy
拷贝sour_path文件至tar_path文件,不包括源文件所有元数据信息
# -*- coding: utf-8 -*-
import shutil
sour_path = r'C:\test\source\zszxz.txt'
tar_path = r'C:\test\target\new_zszxz.txt'
shutil.copy(sour_path, tar_path)
3.6 copy2
拷贝sour_path文件至tar_path文件,尝试拷贝源文件所有元数据信息
# -*- coding: utf-8 -*-
import shutil
sour_path = r'C:\test\source\zszxz.txt'
tar_path = r'C:\test\target\new_zszxz.txt'
shutil.copy2(sour_path, tar_path)
3.7copytree
- 删除目标target(否则异常,详细说明见章节2)
- 将sour_path目录下文件拷贝tar_path目录下;
- 忽略拷贝.pyc结尾文件,tmp开头的目录
# -*- coding: utf-8 -*-
import shutil
sour_path = r'C:\test\source'
tar_path = r'C:\test\target'
result = shutil.copytree(sour_path, tar_path, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
print(result)
输出
C:\test\target
3.8 rmtree
- 删除整个source目录下所有文件
- 移除文件发生异常会由shutil.Error进行处理(读者应自定义异常进行处理,知识追寻者这边不作详细处理)
# -*- coding: utf-8 -*-
import shutil
sour_path = r'C:\test\source'
shutil.rmtree(sour_path, onerror=shutil.Error)
3.9 move
- 将source整个目录包括文件移动到target目录下
- 返回目标目录
# -*- coding: utf-8 -*-
import shutil
sour_path = r'C:\test\source'
tar_path = r'C:\test\target'
result = shutil.move(sour_path, tar_path, copy_function=shutil.copy2)
print(result)
输出
C:\test\target\source
3.10 disk_usage
# -*- coding: utf-8 -*-
import shutil
path = r'C:\test\target\source'
result = shutil.disk_usage(path)
print(result)
输出:
usage(total=510979805184, used=230944526336, free=280035278848)