Python文件迁移之Shutil库详解

       Shutil是一个Python内置的用来高效处理文件和目录迁移任务的库。Shutil不仅支持基本的文件复制、移动和删除操作,还具备处理大文件、批量迁移目录、以及跨平台兼容性等特性。通过使用Shutil,我们可以更加轻松地实现文件系统的管理和维护,本文我将讲解该库的使用方法以需要注意的地方。

目录

 StrPath与BytesPath

 文件元数据(MetaData)

基础元数据

 时间戳元数据

 权限元数据 

系统级元数据 

符号链接

符号链接基本含义

什么时候用符号链接 

复制文件

shutil.copy

可能出现的错误

shutil.copyfile

可能出现的错误

shutil.copy2

可能出现的错误

移动文件

shutil.move

可能出现的错误:

删除目录 

shutil.rmtree

总结:

 StrPath与BytesPath

        在使用shutil内置的函数时,部分函数观察其注释可以发现传入的路径参数有两种。分别是字符串路径StrPath与BytesPath,这里我们来讲一下二者的区别。

BytesPath是路径的二进制表示形式,通常用于:

  • 处理 ​非 UTF-8 编码的文件名​(如某些特殊字符或非标准编码的文件系统)
  • 与底层操作系统 API 交互时(某些系统调用需要二进制格式的路径)

其实就是字符串的字节码,我们可以使用encode函数来将一个字符串转换为字节码

StrPath=r"E:\Desktop\lec01.pptx"
print(StrPath)
BytesPath=r"E:\Desktop\lec01.pptx".encode('utf-8')#utf-8是通用的编码方式
print(BytesPath)

对于纯英文路径来说将encode为字节码之后,即变为Bytes型路径后其输出结果为:b‘原路径’

当路径中含有非英文单词时,将其encode为字节码之后, 即变为Bytes型路径后其输出结果:

中文字符课程被encode为utf- 8类型的字节码是'\xe8\xaf\xbe\xe7\xa8\x8b',其余部分保持不变

 文件元数据(MetaData)

        文件元数据是描述文件属性的数据,包含除文件内容本身外的所有信息。在Windows系统中可以通过右键文件点击属性在属性面板中查看

基础元数据

元数据类型说明查看方法(Python)
文件名文件的名称os.path.basename(filepath)
文件大小文件的字节大小os.path.getsize(filepath)
文件类型文件扩展名/格式os.path.splitext(filepath)[1]
文件路径文件的完整存储路径os.path.abspath(filepath)

 时间戳元数据

时间戳类型说明Unix对应字段Windows对应字段
创建时间(ctime)文件创建时间st_ctimest_ctime
修改时间(mtime)文件内容最后修改时间st_mtimest_mtime
访问时间(atime)文件最后被访问时间st_atimest_atime
元数据修改时间文件属性(非内容)最后修改时间(Unix特有)st_ctime-

 权限元数据 

权限类型说明Unix查看Windows查看
文件模式读写执行权限(rwx)stat.st_mode文件属性→安全选项卡
用户ID(UID)文件所有者IDstat.st_uid-
组ID(GID)文件所属组IDstat.st_gid-
访问控制列表(ACL)更精细的权限控制getfacl命令文件属性→安全→高级

系统级元数据 

元数据类型说明查看方法
设备ID文件所在的设备标识符stat.st_dev
inode编号文件系统索引节点号(Unix)stat.st_ino
硬链接数指向该文件的硬链接数量stat.st_nlink
文件系统标志文件特殊属性(如只读、隐藏等)stat.st_flags(Unix)

上述表格中提到的元数据都可以使用os库来查看,具体代码如下: 

import os
from datetime import datetime
s=os.stat(r'BG.py')
print("="*50)
print(f"大小: {s.st_size} 字节")
print(f"设备: {s.st_dev}")
print(f"inode: {s.st_ino}")
print(f"硬链接数: {s.st_nlink}")
print(f"权限: {oct(s.st_mode)}")
print(f"所有者UID: {s.st_uid}")
print(f"所属组GID: {s.st_gid}")
print(f"创建时间: {datetime.fromtimestamp(s.st_ctime)}")
print(f"修改时间: {datetime.fromtimestamp(s.st_mtime)}")
print(f"访问时间: {datetime.fromtimestamp(s.st_atime)}")

        当然,shutil某些函数在对文件操作时也会涉及到对上述元数据的操作。

符号链接

     在使用shutil的一些函数时,大家可能会看到follow_symlinks类似的参数,这里的symlinks指的是符号链接,所谓符号链接(Symbolic Link,也叫软链接)就像电脑里的"快捷方式"或"替身",但它比普通的快捷方式更强大。

符号链接基本含义

        使用一个不恰当的比喻, 符号链接其实就像是个书签 📖。

        想象你在看一本很厚的书,你在第1页写了个笔记:"重要内容见第500页"。那么这个笔记其实就是一个符号链接:

  • 实际文件​ = 第500页的内容
  • 符号链接​ = 第1页的这个笔记
    你通过这个"笔记"能直接找到真正的内容

   他的特点就是:

  • 文件大小很小(就像书签只占一点点位置)
  • 删除符号链接不会影响原文件(撕掉书签不会删除第500页)

 这实际与我们安装应用时创建的快捷方式类似,当然二者还是有一些区别的,以下是二者的区别:

特性符号链接普通快捷方式
系统层级文件系统级别应用级别
兼容性所有程序都能识别部分程序识别
跨设备可以指向网络位置通常只能本地

什么时候用符号链接 

  1. 节省空间​:同一个大文件需要在多个位置使用

    比如:你的电影库实际存放在D盘,但在C盘的"我的影片"文件夹里创建链接

  2. 版本切换​:快速切换不同版本软件

    比如:python 链接可以指向 python3.8 或 python3.9

  3. 系统维护​:不改动原有结构的情况下调整文件位置

复制文件

当我们使用shutil复制文件时,共有以下函数可以用来复制文件,他们的主要作用如下表所示:

函数名称功能描述
shutil.copy(src, dst)复制文件到目标路径dst可以是目录或新文件名),​不保留文件元数据
shutil.copyfile(src, dst)仅复制文件内容,dst必须是完整文件名且不能已存在,否则报错
shutil.copytree(src, dst)递归复制整个目录树​(包括子目录),要求目标目录dst必须不存在
shutil.copy2(src, dst)功能同copy(),但会保留文件元数据​(如修改时间、权限等)
shutil.copymode(src, dst)仅复制文件的权限模式​(不复制内容或元数据)
shutil.copyfileobj(fsrc, fdst)文件对象级别复制内容(需手动打开文件对象)
shutil.copystat(src, dst)仅复制文件的元数据​(权限、时间戳等),​不复制文件内容

shutil.copy

参数详解:

参数含义类型
src待复制的源文件路径字符串或Bytes字节码路径str or bytes str
dst目标路径的字符串或Bytes字节码路径(可以是文件夹也可以是文件名)str or bytes str
follow_symlinks复制符号链接指向的实际文件内容还是复制符号链接本身bool

代码:

        需要注意的是shutil.copy只会复制文件内容,并不复制元数据,像修改时间等这些元数据都是运行代码后产生的

src路径下文件:

import os
import shutil
shutil.copy(src=r"E:\Desktop\文件保存\26162605op6m.pdf",dst=os.getcwd())

运行代码后dst路径下文件: 

可以看到最近修改时间变成了实际运行代码时间 

可能出现的错误

Permission Error(dst路径下已包含src路径下的内容):

      需要注意的是dst路径为目录时其内部不能含有src路径下的同名文件,否则会出现Permission Error,这其实与我们试图将一个同名文件复制到已经包含该文件的文件夹时弹出的提示类似,只不过shutil并不能决定你是否选择替换还是跳过,而是直接抛出异常。

运行第一次后,当前目录下已经包含src路径下的文件,再次运行便会出现Permission Error

shutil.copyfile

        shutil.copyfile与shuitl.copy函数唯一不同的地方在于它的dst路径必须是文件名且不能在dst路径中已存在(新建一个空白的也不行),而shutil.copy则既可以是目录名也可以是文件名(是文件名的时候内容空白或名字重复无所谓)。当然,shutil.copyfile函数也只会复制文件内容,并不复制元数据,像修改时间等这些元数据都是运行代码后产生的。

参数详解:

参数含义类型
src待复制的源文件路径字符串str
dst目标路径的字符串(必须是文件名且不能已存在)str 
follow_symlinks复制符号链接指向的实际文件内容还是复制符号链接本身bool

代码:

src路径下文件:

import os
import shutil
dst=os.path.join(os.getcwd(),"小谢的selenium操作手册.docx")
shutil.copyfile(src=r"E:\Desktop\测试开发\小谢的selenium操作手册.docx",dst=dst)

运行代码后dst路径下文件: 

可以看到最近修改时间变成了实际运行代码时间 

可能出现的错误

Permission Error(dst路径下已包含src路径下的内容):

      需要注意的是dst路径下不能含有src路径下的同名文件,否则会出现Permission Error,这其实与我们试图将一个同名文件复制到已经包含该文件的文件夹时弹出的提示类似,只不过shutil并不能决定你是否选择替换还是跳过,而是直接抛出异常。

运行第一次后,当前目录下已经包含src路径下的文件,再次运行便会出现Permission Error

shutil.copy2

        shutil.copy2函数的参数与shutil.copy完全一致,二者唯一的区别是shutil.copy2会一同复制元数据。

 参数详解:

参数含义类型
src待复制的源文件路径字符串或Bytes字节码路径str or bytes str
dst目标路径的字符串或Bytes字节码路径(可以是文件夹也可以是文件名)str or bytes str
follow_symlinks复制符号链接指向的实际文件内容还是复制符号链接本身bool

代码:

src路径下文件:

import os
import shutil
dst=shutil.copy2(src=r"E:\Desktop\测试开发\小谢的selenium操作手册.docx",dst=os.getcwd())

运行代码后dst路径下文件: 

元数据一模一样(这里只看修改时间便可以看出)。 

可能出现的错误

Permission Error(dst路径下已包含src路径下的内容):

      需要注意的是dst路径为目录时该目录下不能含有src路径下的同名文件,否则会出现Permission Error,这其实与我们试图将一个同名文件复制到已经包含该文件的文件夹时弹出的提示类似,只不过shutil并不能决定你是否选择替换还是跳过,而是直接抛出异常。

运行第一次后,当前目录下已经包含src路径下的文件,再次运行便会出现Permission Error

移动文件

shutil.move

参数详解:

参数含义类型
src待复制的源文件字符串或Bytes字节码路径str 
dst目标路径的字符串或Bytes字节码路径str
copy_funciton复制文件回调函数,默认是shuti.copy2callable

代码: 

import os
import shutil
shutil.move(src=r"E:\Desktop\文件保存\.docx",dst=os.getcwd())

        关于copy_function这一参数的说明:

shutil.move函数文档注释内容 

        所谓移动文件其实就是先把文件复制到目标路径下,然后再把原路径下的文件删除。而将文件复制到目标路径下这一功能无非就是使用shutil.copy,shutil.copy2等函数来实现,正如上边注释所言:可选的 'copy_function' 参数是将要使用的可调用复制源,否则它将被委托给 'copytree'。默认情况下,使用 copy2()

可能出现的错误:

Permission Error(src路径下的文件已被打开):

        在任何操作系统上我们都无法对一个已经被打开的文件进行迁移操作,如果src路径下的文件被打开,那么自然也会抛出PermissionError的错误。

Error(dst路径下已经有一个与src传入路径下同一个basename的文件)

dst路径下有一个名为test.docx的文件

提示test.docx already exists 

删除目录 

        shutil.rmtree是shutil模块中唯一用来删除文件的函数,当然可以用来删除文件的函数还有很多,比如os模块下的os.remove,os.rmdir,下表给出了这几三者之间的区别:

函数能删文件能删空目录能删非空目录适用场景
shutil.rmtree()❌ 不能✔️ 可以✔️ 可以仅用于删除目录树(彻底删除内部所有文件夹及内容)
os.remove()✔️ 可以❌ 不能❌ 不能仅用于删除单个文件
os.rmdir()❌ 不能✔️ 可以❌ 不能仅用于删除空目录

shutil.rmtree

参数详解:

参数类型默认值功能描述
pathstr必填要删除的目录路径,需要注意的是路径必须是目录且不为空
ignore_errorsboolFalse是否忽略删除过程中可能产生的各种错误
onerrorcallableNone错误处理回调函数
dir_fdintNone目录文件描述符(仅Unix)
onexc (Python 3.12+)callableNone异常处理回调函数(新版替代

在该文件夹下,我创建了3层深度的文件夹,并在内部新建了一个txt类型文件 

代码 :

import shutil
shutil.rmtree(r"E:\Desktop\rmtree测试",ignore_errors=True)

运行代码后,该文件夹被彻底删除!但是os.remove和os.remdir对此却无能为力

总结:

        shutil是一个python内置的用来进行文件迁移的模块,该模块本质上是对os模块处理文件相关操作的二次开发,比如shutil.copyfile函数,其实就是在使用with open语句进行两次io操作:先读取src内容,再将读取内容写入到dst路径。

        类似这样的操作我们自己也可以写出来,只不过并不一定会考虑到各种可能存在的异常情况以及跨平台兼容性等问题,而shutil则已经将这些情况全部考虑并封装成为了‘’轮子‘’供我们直接调用,快捷而方便。当然,这也是Python的特色之一。

        我想要驾驶一辆汽车,难道还需要自己制造轮胎吗?

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

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

相关文章

【服务器R环境架构】基于 micromamba下载 R 库包

目录 准备工作:下载并安装R环境下载并安装R环境方式1:下载 .tar.bz2 压缩包进行解压执行(官方推荐)方式2: 创建并激活R环境 下载R库包安装CRAN包在 micromamba 中安装 GitHub 包(如 BPST) 参考 …

基于 Apache POI 实现的 Word 操作工具类

基于 Apache POI 实现的 Word 操作工具类 这个工具类是让 AI 写的,已覆盖常用功能。 如不满足场景的可以让 AI 继续加功能。 已包含的功能: 文本相关: 添加文本、 设置字体颜色、 设置字体大小、 设置对齐方式、 设置字符间距、 设置字体加粗…

时间序列预测、分类 | 图神经网络开源代码分享(上)

本期结合《时间序列图神经网络(GNN4TS)综述》,整理了关于图神经网络在时间序列预测、分类等任务上的开源代码和学习资料以供大家学习、研究。 参考论文:《A Survey on Graph Neural Networks for Time Series: Forecasting, Classification, Imputation,…

Vue 添加水印(防篡改: 删除水印元素节点、修改水印元素的样式)

MutationObserver_API: 观察某一个元素的变化// index.vue<template><div class="container"><Watermark text="版权所有" style="background: #28c848"><!-- 可给图片、视频、div...添加水印 --><div class=&quo…

如何处理开发不认可测试发现的问题

解决方案 第一步&#xff1a;收集确凿证据 确保有完整的复现结果准备详细的记录材料&#xff1a; 截屏录屏操作步骤记录 带着这些证据与开发人员进行沟通 第二步&#xff1a;多角度验证 如果与开发人员沟通无果&#xff1a; 竞品分析&#xff1a;查看市场上同类产品如何…

linux生产环境下根据关键字搜索指定日志文件命令

grep -C 100 "error" server.log 用于在 server.log 文件中查找包含 “error” 的行&#xff0c;并同时显示该行前后100行的上下文。这是排查日志问题的常用技巧&#xff0c;解释一下&#xff1a; 命令参数详解 grep&#xff1a;文本搜索工具&#xff0c;用于在文件…

用vue和echarts怎么写一个甘特图,并且是分段式瀑布流

vue echarts 甘特图功能 index.vue <template><div ref"echart" id"echart" class"echart"></div> </template><script setup>import { nextTick, onMounted, ref } from "vue";import * as echarts f…

Pandas使用教程:从入门到实战的数据分析利器

一、Pandas基础入门 1.1 什么是Pandas Pandas是Python生态中核心的数据分析库&#xff0c;提供高效的数据结构&#xff08;Series/DataFrame&#xff09;和数据分析工具。其名称源于"Panel Data"&#xff08;面板数据&#xff09;和"Python Data Analysis"…

NuttX Socket 源码学习

概述 NuttX 的 socket 实现是一个精心设计的网络编程接口&#xff0c;提供了标准的 BSD socket API。该实现采用分层架构设计&#xff0c;支持多种网络协议族&#xff08;如 TCP/IP、UDP、Unix域套接字等&#xff09;&#xff0c;具有良好的可扩展性和模块化特性。 整体架构设…

基于YOLO的语义分割实战(以猪的分割为例)

数据集准备 数据集配置文件 其实语义分割和目标检测类似&#xff0c;包括数据集制备、存放格式基本一致像这样放好即可。 然后需要编写一个data.yaml文件&#xff0c;对应的是数据的配置文件。 train: C:\图标\dan\语义分割pig\dataset\train\images #绝对路径即可 val: C:\…

钉钉智能会议室集成指纹密码锁,临时开门密码自动下发

在当今快节奏的工作环境中&#xff0c;会议室的高效管理和使用成为了企业提升工作效率的关键一环。湖南某知名企业近期成功升级了原有使用的钉钉智能会议室系统&#xff0c;并配套使用了启辰智慧联网指纹密码锁&#xff0c;实现了会议室管理的智能化升级&#xff0c;提升了会议…

C++讲解—类(1)

类 在 C 中&#xff0c;类是一个关键概念&#xff0c;凭借其封装和继承的特性&#xff0c;能够助力程序员之间实现高效的分工协作&#xff0c;共同完成复杂的大型项目。我们先从最简单的概念入手&#xff0c;再进行更深层次的了解和应用。 1. 类的定义 类是用户自定义的一种…

什么是Hadoop Yarn

Hadoop YARN&#xff1a;分布式集群资源管理系统详解 1. 什么是YARN&#xff1f; YARN&#xff08;Yet Another Resource Negotiator&#xff09;是 Apache Hadoop 生态系统中的资源管理和作业调度系统&#xff0c;最初在 Hadoop 2.0 中引入&#xff0c;取代了 Hadoop 1.0 的…

项目开发中途遇到困难的解决方案

1. 正视困难&#xff0c;避免逃避 开发遇阻时&#xff0c;退缩会带来双重损失&#xff1a;既成为"失败者逃兵"&#xff0c;又损害职业信心1。 行动建议&#xff1a; 立即向团队透明化问题&#xff08;如进度延迟、技术瓶颈&#xff09;&#xff0c;避免问题滚雪球…

Blender硬表面建模篇收集学习建模过程中的Demo

c 齿轮 创建一个圆柱体&#xff0c;选择侧面的所有&#xff0c;然后进行隔断选择&#xff0c;两次挤出面&#xff0c;一次缩放面&#xff0c;通过圆柱面三次插入面缩放挤出得到齿轮中心&#xff0c;选中齿轮的锯齿中间&#xff0c;然后进行相同周长选择行选择齿与齿中间的面&…

Chromium 136 编译指南 macOS篇:获取源代码(四)

1. 引言 在现代软件开发的宏大版图中&#xff0c;源代码的获取往往标志着从理论探索向实践应用的关键转折。对于Chromium 136这样一个拥有超过2500万行代码、涉及数百个第三方库的超大规模开源项目而言&#xff0c;源代码的获取不仅仅是简单的文件下载&#xff0c;更是一个涉及…

OpenCV C++ 边缘检测与图像分割

一、边缘检测 在数字图像处理领域&#xff0c;边缘检测是一项至关重要的基础技术。它如同为图像赋予 “骨架”&#xff0c;帮助计算机快速识别图像中的物体轮廓、形状与结构&#xff0c;广泛应用于目标识别、图像分割、图像配准等多个领域。 1.1 概念 边缘检测的核心目标是找…

线段树(2025年6月14日)

原文 https://www.beiweidoge.top/132.html P1&#xff1a;求最大值1 题目描述 题目描述 小明给了你n个数字&#xff0c;你需要依次输出&#xff1a; 1到n的最大值&#xff0c;1到n/2的最大值&#xff0c;n/21到n的最大值&#xff0c;1到n/4的最大值&#xff0c;n/41到n/2…

渗透实战PortSwigger Labs AngularJS DOM XSS利用详解

本Lab学习到关于AngularJS的 xss 漏洞利用 直接输入回显页面&#xff0c;但是把<>进了 html 编码了 当我们输入{{11}}&#xff0c;没有当作字符处理&#xff0c;而是执行了 {{}} 是多种前端框架&#xff08;如 Vue、Angular、Django 模板等&#xff09;中常见的模板插值语…

Ubuntu 多网卡安全路由配置(SSH 不断线版)

Ubuntu 多网卡路由配置笔记&#xff08;内网 外网同时通&#xff09;&#xff08;SSH断线版&#xff09;文章浏览阅读386次&#xff0c;点赞4次&#xff0c;收藏5次。本文介绍了Ubuntu 如何配置双网卡设备的路由规则&#xff0c;使默认流量走外网&#xff08;192.168.2.0/24&a…