感谢点赞和关注 ,每天进步一点点!加油!
目录
一、shutil介绍
二 、使用详解
2.1 复制函数
2.1.1 shutil.copy
2.1.2 shutil.copy2
2.1.3 shutil.copyfile
2.1.4 shutil.copytree
2.2 移动文件
2.2.1 shutil.move
2.3 删除文件
2.3.1 shutil.rmtree
2.4 文件和文件夹打包
2.5 实战案例
一、shutil介绍
OS 模块是Python标准库中一个重要的模块,里面提供了对目录和文件的一般常用操作。而Python另外一个标准库——shutil库,它作为os模块的补充,提供了复制、移动、删除、压缩、解压等操作,这些 os 模块中一般是没有提供的。但是需要注意的是:shutil 模块对压缩包的处理是调用 ZipFile 和 TarFile这两个模块来进行的。
二 、使用详解
2.1 复制函数
2.1.1 shutil.copy
源码方法注解
def copy(src, dst, *, follow_symlinks=True):
"""Copy data and mode bits ("cp src dst"). Return the file's destination.
The destination may be a directory.
If follow_symlinks is false, symlinks won't be followed. This
resembles GNU's "cp -P src dst".
If source and destination are the same file, a SameFileError will be
raised.
# linux
cp -P src dst same as --preserve=mode,ownership,timestamps
copy() 复制文件数据和文件许可模式,不保留其他元数据,例如文件的创建时间和修改时间,要保留原始文件中的所有文件元数据,应用copy2()。注意: copy()不能用于复制目录。
- src为源文件路径(必须是文件),dst为目标文件路径(文件名可加可不加)
- 目标文件如存在会覆盖掉,不存在会创建新文件, 包括路径
- 只copy内容和权限,其他文件属性如时间没有copy,注意权限是copy了
- 返回值为目标文件路径
import shutil
shutil.copy('/root/data.txt','/root/data_copy.txt' ) #目标文件无需存在
执行结果如下:
我们可以看到 data_copy.txt 文件的创建时间与原始文件 不一样,为系统时间。
2.1.2 shutil.copy2
def copy2(src, dst, *, follow_symlinks=True):
"""Copy data and all stat info ("cp -p src dst"). Return the file's
destination."
The destination may be a directory.
If follow_symlinks is false, symlinks won't be followed. This
resembles GNU's "cp -P src dst".
"""
if os.path.isdir(dst):
dst = os.path.join(dst, os.path.basename(src))
copyfile(src, dst, follow_symlinks=follow_symlinks)
copystat(src, dst, follow_symlinks=follow_symlinks)
return dst
拷贝文件和状态信息,copy2()尝试将所有元数据从源文件的符号链接复制到新创建的目标文件的符号链接。但是此功能并非在所有平台上都可以用。在某些或所有此功能不可用的平台上,copy2()将保留所有可能的元数据。shutil.copy2()相同于同时做了shutil.copyfile()和shutil.copystat(),因此该方法名字这里的copy2可以简单记忆成2次copy。
注意: copy2()不能用于复制目录
Linux 中 cp -p 参数 -P: same as --preserve=mode,ownership,timestamps
import shutil
shutil.copy2('/home/kangll/data01.txt','/home/kangll/data_copy2.txt' ) #目标文件无需存在
如下使用 root 用户 执行 test.py 脚本:
切换到kangll 用户执行,copy2 后的文件权限和创建时间 都和原始文件一样。
总结
Python的shutil.copy2()函数会复制文件的权限,并尽可能地保留文件的元数据,包括所有权、时间戳等等。与shutil.copy()函数不同的是,shutil.copy2()函数会尽量保留源文件的所有元数据,而不是只复制一部分。
2.1.3 shutil.copyfile
将一个文件的内容拷贝到另一个文件中,目标文件无需存在
copyfile(src, dst, *, follow_symlinks=True)
参数 | 描述 |
src | 源路径 |
dst | dst为目标文件路径,且必须包含文件名,文件存在则会覆盖 |
follow_symlinks | 设置为True时,若src为软连接,则当成文件复制;如果设置为False,复制软连接。默认为True。 |
实例:
import shutil
shutil.copyfile('/home/kangll/data01.txt','/home/kangll/data_copyfile.txt' )
执行结果:
2.1.4 shutil.copytree
copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,
ignore_dangling_symlinks=False)
参数说明:
参数 | 描述 |
src | 源路径 |
dst | 目标路径 , 目标目录必须不存在 |
symlinks=False | 由符号指向的文件的内容链接被复制 |
copy_function | 可选的copy_function参数是一个将被使用的可调用对象 复制每个文件。将使用源路径和目标路径作为参数。默认情况下,使用copy2() |
示例:
import shutil
shutil.copytree('/home/kangll/copytree','/home/kangll/copytree_test') # 目标目录必须不存在
执行结果:
如果目标路径存在 则会报出错误
2.2 移动文件
2.2.1 shutil.move
move(src, dst, copy_function=copy2)
"""
递归移动文件或目录到另一个位置。这是
类似于Unix的“mv”命令。返回文件或目录的
目的地。
"""
实例:
import shutil
shutil.move('/home/kangll/data01.txt','/home/kangll/move')
执行结果:
2.3 删除文件
2.3.1 shutil.rmtree
import shutil
shutil.rmtree("/home/kangll/copytree_test")
2.4 文件和文件夹打包
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、gztar
- root_dir:打包时切换到的根路径。默认值为当前路径
- base_dir:要打包的路径。也就是说对base_dir所指定的路径进行打包,默认值为 root_dir
实例:
import shutil
# #### 三个参数说明
# 打包后tar包保存路径 home/kangll/move/copytree tar包名字为 copytree
# 格式 tar包
# 要打包的文件路径
shutil.make_archive("/home/kangll/move/copytree","tar","/home/kangll/copytree")
# 和上面的执行结果一样
# shutil.make_archive("/home/kangll/move/copytree","tar",base_dir="/home/kangll/copytree")
执行结果:
使用 Linux 命令解压:
2.5 实战案例
需求:将指定目录的文件根据文件名匹配 将文件移动到指定的目录。
move_file.py
# -*- coding:UTF-8 -*-
import logging
import os
import re
import shutil
import sys
from imp import reload
from logging.handlers import RotatingFileHandler
reload(sys)
# 初始化日志
logger = logging.getLogger('mylogger')
logger.setLevel(level=logging.INFO)
fmt = '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
format_str = logging.Formatter(fmt)
fh = RotatingFileHandler("move_file.log", maxBytes=10*1024*1024, backupCount=2,encoding="utf-8")
fh.namer = lambda x: "backup."+x.split(".")[-1]
fh.setFormatter(fmt=format_str)
logger.addHandler(fh)
def move_file(res_dir, tar_dir, pattern):
""" 文件移动
:param res_dir: 源路径
:param tar_dir: 目标路径
:param pattern: 正则匹配模式
:return:
"""
try:
logger.info("开始移动文件!")
for filename in os.listdir(res_dir):
# 获取文件的完整路径
file_path = os.path.join(res_dir, filename)
print(filename, pattern)
# 正则匹配文件名
if re.match(pattern, filename):
shutil.move(file_path, tar_dir) # 移动文件 # shutil库,它作为os模块的补充,提供了复制、移动、删除、压缩、解压
print("已移动文件【%s】" %filename)
logger.info("结束移动文件!")
except Exception as why:
print(why)
if __name__ == "__main__":
print(sys.argv)
if len(sys.argv) == 4:
move_file(sys.argv[1], sys.argv[2], sys.argv[3])
在Windows 上调用
python.exe D:\\IPVA\\file_move\\move_file.py D:\\IPVA\Data_Traffic\\DataServerCloud01_AlarmEvent\\ D:\\IPVA\Data_Traffic_Bak\\DataServerCloud01_AlarmEvent\\ Data.*.COMPLETED
移动成功, 之后我又做了ren重命名
https://www.cnblogs.com/ltkekeli1229/p/15709414.html
Python的shutil模块解析_python shutil_斩心之鬼的博客-CSDN博客