Python系列模块之标准库shutil详解

news2024/11/25 4:33:18

    感谢点赞和关注 ,每天进步一点点!加油!

目录

一、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博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/579064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue-后台管理项目001---侧边栏

从浏览器上可以看出,他的返回值是promise(pending),所以我们可以用async,await来简化这个操作 await只能用在被async修饰的方法中,需要把仅挨着await的方法修饰成async 需要把仅挨着await的方法修饰成异步的async现在可以将这个da…

1-1 统计数字问题

题目: 我的答案: 一、信息 二、分析 1.如何选择数据结构? 2.如何选择算法有很多思路? 3.如何用文件实现输入输出? 三、思考 疑问1 我选择了一开始数组选择使用数组是一个不错的选择,尤其在这个问题中…

【网络协议详解】——DHCP系统协议(学习笔记)

目录 🕒 1. DHCP概述🕒 2. 工作过程🕒 3. DHCP的报文格式🕒 4. DHCP中继代理🕒 5. 实验:DHCP配置 🕒 1. DHCP概述 动态主机配置协议DHCP(Dynamic Host Configuration Protocol&…

TA-lib第三方库安装问题

因为学习的需要,用到Talib库做写指标分析,但是百度了好久,说是去要某某网站下载对应版本的文件进行本地安装,但是把…404 Not found 然后通过查找,Ta-lib库的安装已经迁移到这里了 https://github.com/TA-Lib/ta-lib-p…

【SpringBoot教程】SpringBoot+MybatisPlus数据库连接测试 用户收货信息接口开发

⛪ 专栏地址 系列教程更新中 🚀 文章介绍: SpringBootMybatisPlus组合可以大大加快开发效率,紧接上一篇文章的内容,这篇文章进行数据库的连接与查询测试,并配置日志输出调试 🚀 源码获取: 项目中的资料可以通过文章底部…

数据安全治理科技系统能力-数据安全复合治理框架和模型解读(3)

数据治理,数据安全治理行业在发展,在实践,所以很多东西是实践出来的,哪有什么神仙理论指导,即使有也是一家之说,但为了提高企业投产比,必要的认知是必须的,落地数据安全治理科技水平差异直接决定产品和项目是否可持续性,当前和未来更需要专业和有效创新。数据安全治理…

《数据库》期末考试复习手写笔记-第11章 并发控制(锁)【10分】

目录 知识点:封锁活锁死锁可串行化调度 考题1:可串行化调度 考题2:调度正确判断&共享锁写锁 考题3: 事务调度死锁 知识点:封锁活锁死锁可串行化调度 考题1:可串行化调度 考题2:调度正确判…

杨立昆:科学之路读书笔记2

杨立昆:科学之路读书笔记2 人工智能的低谷人工智能无所不能吗?谁将从AI人工智能革命中获益结语 一起学AI系列博客:目录索引 人工智能的低谷 上回分享了读书缘由,杨立昆的背景及其对人工智能的研究看法,这回分享他如何…

15.Kafka系列之事务原理及实践

我们先来回顾下6.Kafka系列之设计思想(四)-消息传递语义中的一些内容 1. 消息传递保证 At most once:最多一次。消息可能会丢失,但永远不会重新传递At least once:至少一次。消息永远不会丢失,但可能会重新传递Exactly once&…

rust 初识基础: 变量、数据类型、函数、所有权、枚举

了解到 rust 和 WebAssembly 的结合使用,可以构建前端应用,而且性能也比较好。初步学习使用 rust 是预编译静态类型语言。 安装 rust 官网下载 rust-CN , 大致了解下为什么选择:高性能、可靠性、生产力。 打开控制台啊,执行安装…

【Servlet】

目录 🎂1. 第一个 Servlet 程序:使用 Servlet 写 hello world 🥞1.1 创建项目 🍳1.2 引入依赖 🎃1.3 创建目录 🍘1.4 开始写代码 🌍1.5 打包代码 🍤1.6 部署 👑1…

如何在华为OD机试中获得满分?Java实现【获取最大软件版本号】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

使用kotlin用回溯法解决电话号码的字母组合问题

17. 电话号码的字母组合 难度中等 2474 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入&#…

23种设计模式中之中介者模式(Mediator Pattern)

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的迭代器模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬…

运维工程师面试总结(含答案)

运维工程师面试总结 原文链接:https://www.cuiliangblog.cn/detail/article/2 一、linux 1. linux系统启动流程 第一步:开机自检,加载BIOS第二步:读取MBR第三步:Boot Loader grub…

uni-app常用场景速查记录

记录一下uniapp开发过程中遇到的问题场景,方便后期查看. 1.elementUI中textarea文本如何设置换行显示 2.uniapp中实现文字滚动显示 3.下拉刷新和触底分页查询 1.elementUI中textarea文本设置换行显示 el-input标签中type为textarea中录入的文本内容,在表格中显示…

关键词搜索1688商品数据采集、1688商品列表数据接口

1688:指中国最大的电子商务综合平台,类似于美国的亚马逊。 关键词:是用于描述检索文档或记录的词语或短语,通常是用户输入的查询信息。 搜索:是在数据库、网页搜索引擎或其他信息存储库中查找信息内容的过程。 商品数…

springboot+springsecurity+jwt+elementui图书管理系统

​​图书管理系统​​ 关注公号&#xff1a;java大师&#xff0c;回复“图书”&#xff0c;获取源码 一、springboot后台 1、mybatis-plus整合 1.1添加pom.xml <!--mp逆向工程 --><dependency><groupId>org.projectlombok</groupId><artifactId&…

腾讯云服务器可用区是什么意思?可用区详细说明

腾讯云服务器可用区什么意思&#xff1f;可用区&#xff08;Zone&#xff09;是指腾讯云在同一地域内电力和网络互相独立的物理数据中心&#xff0c;一个可用区故障不会影响另一个可用区的正常运行&#xff0c;所以可用区用于构建高容灾、高可靠性应用。腾讯云服务器网来详细说…

华为OD机试真题B卷 Java 实现【食堂供餐】,附详细解题思路

一、题目描述 某公司员工食堂以盒饭的方式供餐。 为将员工取餐排队时间降为0&#xff0c;食堂的供餐速度必须要足够快。 现在需要根据以往员工取餐的统计信息&#xff0c;计算出一个刚好能达到排队时间为0的最低供餐速度。 即&#xff0c;食堂在每个单位时间内必须至少做出…