shutil模块,为什么说它是os模块的兄弟模块?
时间:2022-07-26
本文章向大家介绍shutil模块,为什么说它是os模块的兄弟模块?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文大纲
os模块
是Python标准库中一个重要的模块,里面提供了对目录和文件的一般常用操作。而Python另外一个标准库——shutil模块
,它作为os模块的补充,提供了复制、移动、删除、压缩、解压等操作,这些 os 模块中一般是没有提供的。但是需要注意的是:shutil模块对压缩包的处理是调用ZipFile
和TarFile
这两个模块来进行的。
知识串讲
本文所使用的素材,都是基于以下2个文件夹,其中一个文件夹为空。
1)模块导入
import shutil
2)复制文件
-
函数
:shutil.copy(src,dst) -
含义
:复制文件; -
参数
:src表示源文件,dst表示目标文件夹; -
注意
:当移动到一个不存在的“目标文件夹”,系统会将这个不存在的“目标文件夹”识别为新的文件夹,而不会报错;
# 1.将a表的“data.txt”移动到b表
src = r"C:Users黄伟Desktoppublishos模块test_shutil_adata.txt"
dst = r"C:Users黄伟Desktoppublishos模块test_shutil_b"
shutil.copy(src,dst)
------------------------------------------------------------
# 2.将a表的“data.txt”移动到b表,并重新命名为“new_data.txt”
src = r"C:Users黄伟Desktoppublishos模块test_shutil_adata.txt"
dst = r"C:Users黄伟Desktoppublishos模块test_shutil_bnew_data.txt"
shutil.copy(src,dst)
------------------------------------------------------------
# 3.将a表的“data.txt”移动到“不存在”的文件夹
src = r"C:Users黄伟Desktoppublishos模块test_shutil_adata.txt"
dst = r"C:Users黄伟Desktoppublishos模块test_shutil_c"
shutil.copy(src,dst)
"""
注意:对于情况3,系统会默认将“test_shutil_c”识别为文件名,而不是按照我们认为的,移动到一个新的不存在的文件夹。
"""
结果如下:
3)复制文件夹
-
函数
:shutil.copytree(src,dst) -
含义
:复制文件夹; -
参数
:src表示源文件夹,dst表示目标文件夹; -
注意
:这里只能是移动到一个空文件夹,而不能是包含其他文件的非空文件夹,否则会报错PermissionError;
① 如果目标文件夹中存在其他文件,会报错;
# 将a文件夹移动到b文件夹,由于前面的操作,此时b文件夹中已经有其他文件
src = r"C:Users黄伟Desktoppublishos模块test_shutil_a"
dst = r"C:Users黄伟Desktoppublishos模块test_shutil_b"
shutil.copytree(src,dst)
结果如下:
② 如果目标文件夹不存在,则会自动创建;
# c文件夹原本是不存在的,我们使用了下方的代码,会自动创建该文件夹
src = r"C:Users黄伟Desktoppublishos模块test_shutil_a"
dst = r"C:Users黄伟Desktoppublishos模块test_shutil_c"
shutil.copytree(src,dst)
结果如下:
4)移动文件或文件夹
- 函数:shutil.move(src,dst)
-
含义
:移动文件/文件夹; -
参数
:src表示源文件/文件夹,dst表示目标文件夹; -
注意
:文件/文件夹一旦被移动了,原来位置的文件/文件夹就没了。目标文件夹不存在时,相当于文件/文件夹“重命名”。;
# 将当前工作目录下的“a.xlsx”文件,移动到a文件夹下
dst = r"C:Users黄伟Desktoppublishos模块test_shutil_a"
shutil.move("a.xlsx",dst)
----------------------------------------------------------------
# 将a文件夹下的“a.xlsx”文件,移动到b文件夹中,并重新命名为“aa.xlsx”
src = r"C:/Users/黄伟/Desktop/publish/os模块/test_shutil_aa.xlsx"
dst = r"C:Users黄伟Desktoppublishos模块test_shutil_baa.xlsx"
shutil.move(src,dst)
结果如下:
注意:移动文件夹操作类似,我这里就不赘述了,自行下去学习。
5)删除文件夹(慎用)
-
函数
:shutil.rmtree(src) -
含义
:删除文件夹; -
参数
:src表示源文件夹; -
注意
:区别这里和os模块中remove()、rmdir()的用法,remove()方法只能删除某个文件,mdir()只能删除某个空文件夹。但是shutil模块中的rmtree()可以递归彻底删除非空文件夹;
# 将c文件夹彻底删除
src = r"C:Users黄伟Desktoppublishos模块test_shutil_c"
shutil.rmtree(src)
结果如下:
6)创建和解压压缩包
-
zipobj.write()
:创建一个压缩包; -
zipobj.namelist()
:读取压缩包中的文件信息; -
zipobj.extract()
:将压缩包中的单个文件,解压出来; -
zipobj.extractall()
:将压缩包中所有文件,解压出来; -
注意1
:shutil模块对压缩包的处理是调用ZipFile和TarFile这两个模块来进行的,因此需要导入这两个模块; -
注意2
:这里说的压缩包,指的是“.zip”格式的压缩包;
① 创建一个压缩包
import zipfile
import os
file_list = os.listdir(os.getcwd())
# 将上述所有文件,进行打包,使用“w”
with zipfile.ZipFile(r"我创建的压缩包.zip", "w") as zipobj:
for file in file_list:
zipobj.write(file)
结果如下:
② 读取压缩包中的文件信息
import zipfile
with zipfile.ZipFile("我创建的压缩包.zip", "r") as zipobj:
print(zipobj.namelist())
结果如下:
③ 将压缩包中的单个文件,解压出来
-
注意
:目标文件夹不存在,会自动创建;
import zipfile
# 将压缩包中的“test.ipynb”文件,单独解压到a文件夹下
dst = r"C:Users黄伟Desktoppublishos模块test_shutil_a"
with zipfile.ZipFile("我创建的压缩包.zip", "r") as zipobj:
zipobj.extract("test.ipynb",dst)
结果如下:
④ 将压缩包中所有文件,解压出来;
-
注意
:目标文件夹不存在,会自动创建;
import zipfile
# 将压缩包中的所有文件,解压到d文件夹下
dst = r"C:Users黄伟Desktoppublishos模块test_shutil_d"
with zipfile.ZipFile("我创建的压缩包.zip", "r") as zipobj:
zipobj.extractall(dst)
结果如下:
- Nginx反向代理中使用proxy_redirect重定向url
- python try/except/finally
- Jumpserver双机高可用环境部署笔记
- 性能优化
- Nginx基于TCP/UDP端口的四层负载均衡(stream模块)配置梳理
- VB6对滚轮的支持
- 文件实时同步后防篡改的操作记录
- web中的水晶报表 "出现通信错误。将停止打印"
- nginx反向代理中proxy_set_header 运维笔记
- 期待已久的直播能力开放了!年底之前来波大的
- 两个目录中,删除其中一个目录中同名文件的做法
- linux下监控某个目录是否被更改
- centos下升级git版本的操作记录
- linux下core file size设置笔记
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP与SEO,应用curl及正则获取搜狗搜索相关关键词
- Kafka经典面试题,你都会吗?
- 提高单细胞分析准确度的工具之一:Self-assembling manifolds
- 一不小心肝出了4W字的Redis面试教程
- 双向LSTM-CRF模型用于序列标注
- 容器服务 TKE 上服务暴露的几种方式
- 【论文分享】ACL 2020 信息抽取任务中的新动向
- 工匠人iOS 代码规范
- 写一个通用的幂等组件,我觉得很有必要
- PC性能监测工具,您不可或缺的好帮手~~
- 特征工程之处理时间序列数据
- Matplotlib中的“plt”和“ax”到底是什么?
- 使用深度学习模型创作动漫故事,比较LSTM和GPT2的文本生成方法
- 聊聊BitCaskLock
- LightGBM的参数详解以及如何调优