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

  1. 在source文件夹下创建zszxz.txt,指定源文件路径为sour_path
  2. 指定目的文件名路径tar_path
  3. 执行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

  1. 将sour_path文件拷贝至tar_path
  2. 打印返回路径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

  1. 源文件与,目标文件当已存在
  2. 仅拷贝源文件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

  1. 拷贝sour_path文件的权限,上次进入文件时间,上次修改文件时间,标志位至目标文件tar_path
  2. 不影响文件的内容,属主,数组;
# -*- 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

  1. 删除目标target(否则异常,详细说明见章节2)
  2. 将sour_path目录下文件拷贝tar_path目录下;
  3. 忽略拷贝.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

  1. 删除整个source目录下所有文件
  2. 移除文件发生异常会由shutil.Error进行处理(读者应自定义异常进行处理,知识追寻者这边不作详细处理)
# -*- coding: utf-8 -*-
import shutil

sour_path = r'C:\test\source'
shutil.rmtree(sour_path, onerror=shutil.Error)

3.9 move

  1. 将source整个目录包括文件移动到target目录下
  2. 返回目标目录
# -*- 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)
posted @ 2020-05-07 14:36  知识追寻者  阅读(204)  评论(0编辑  收藏  举报