【Python军火库】shutil、os、zipfile:组织文件三件套

在这里插入图片描述


一、shutil模块

1.文件和文件夹的复制与改名

【01】shutil.copy(source, destination)

将路径source处的文件复制到路径destination处的文件夹;如果destination是一个文件名,它将作为被复制文件的新名字。

import shutil

shutil.copy(r'E:\【05】编程设计\Python\Python自动化办公\测试\文件夹1\hello.txt',
	r'E:\【05】编程设计\Python\Python自动化办公\测试\文件夹2')
shutil.copy(r'E:\【05】编程设计\Python\Python自动化办公\测试\文件夹1\hello.txt',
	r'E:\【05】编程设计\Python\Python自动化办公\测试\文件夹2\你好.txt')    # 复制并改名

也就是通过shutil.copy()函数,我们可以实现单个文件的复制与改名操作。

【02】shutil.copytree(source, destination)

shutil.copy()是复制一个文件,而shutil.copytree()能够复制整个文件夹,包括该文件夹内的所有文件和文件夹。

import shutil

#【01】文件和文件夹的复制与改名
shutil.copytree(r'E:\【05】编程设计\Python\Python自动化办公\测试\文件夹1', 
	r'E:\【05】编程设计\Python\Python自动化办公\测试\文件夹3')   # 实际相当于创建了一个新文件夹

——

2.文件和文件夹的移动与改名

【01】shutil.move(source, destination)

通过使用shutil.move()函数,我们可以实现文件和文件夹的移动与改名。在使用该函数时,要注意以下几点:

  1. source是文件A,destination是已存在的文件夹B,则将文件A移动到文件夹B下;如果文件夹中存在同名文件,则会被覆盖。
  2. source是文件A,destination是带路径的文件B,则文件A则会被移动到该路径下并改名为B。
  3. source是文件A,destination是同目录下的文件B,则文件A改名为文件B。

如果source是文件夹A,则按照以上的套路代入即可,原理都是一样。

import shutil

#【02】文件和文件夹的移动与改名
shutil.move(r'E:\【05】编程设计\Python\Python自动化办公\测试\文件夹3\hello.txt',
	r'E:\【05】编程设计\Python\Python自动化办公\测试\文件夹4')
shutil.move(r'E:\【05】编程设计\Python\Python自动化办公\测试\文件夹3\hello.txt',
	r'E:\【05】编程设计\Python\Python自动化办公\测试\文件夹4\你好.txt')
shutil.move(r'E:\【05】编程设计\Python\Python自动化办公\测试\文件夹3\hello.txt',
	r'E:\【05】编程设计\Python\Python自动化办公\测试\文件夹3\hello.txt')

——

3.永久删除文件和文件夹

利用os模块,我们可以实现删除一个文件或一个空文件夹;但利用shutil模块,我们可以永久(不可逆)地删除一个文件夹及其所有的内容。

  • os.unlink(path) 将删除path处的文件(单个)
  • os.rmdir(path) 将删除path处的文件夹(空白)
  • shutil.rmtree(path) 将删除path处的文件夹,包括包含的所有文件和文件夹

一定要注意的是,shutil.rmtree()会永久地不可逆地删除文件,所以用起来得万分小心。

那有没有更加的删除方法呢?如果我们不小心把需要的文件删除了能够恢复的方法?

有,那就是用send2trash模块进行删除。

——

4.用send2trash模块安全删除

send2trash是第三方模块,它比Python常规的删除函数要安全得多,它会将文件和文件夹发送到计算机的垃圾箱或者回收站,而非永久性删除。

进而我们可以在电脑回收站中选择永久删除或者恢复文件和文件夹。

要使用send2trash,我们首先要进行安装。

打开命令提示符,输入 pip install send2trash

import send2trash

#【04】用send2trash模块安全删除
baconFile = open('bacon.txt','a')       # 创建txt文件
baconFile.write('Bacon is not a vegatable')   # 文件中写入内容
baconFile.close()
send2trash.send2trash('bacon.txt')   # 用send2trash删除文件

在这里插入图片描述

二、os.walk()遍历目录树

有些时候我们需要遍历整个文件夹,比如要对某个文件夹中的所有文件夹改名,包括该文件夹下的所有子文件夹中的文件。

这个时候我们就需要用到os.walk()函数,再结合for循环,就能实现遍历目录树的操作。

os.walk(path) 传入一个文件路径的字符串,在循环的每次迭代中会返回3个值。

  1. 当前文件夹名称的字符串
  2. 当前文件夹中子文件夹的字符串的列表
  3. 当前文件夹中文件的字符串的列表

值得重点提醒的是,所谓的当前文件夹指的是for循环当前迭代的文件夹。

import shutil

for folderName, subfolders, filenames in os.walk(r'E:\【05】编程设计\Python\Python自动化办公\【09】组织文件\delicious'):
	print('当前文件夹:'+folderName) 
	print('包含子文件夹:', end='')
	for subfolder in subfolders:
		print(subfolder, end=' ') 

	print()

	print('包含文件:', end='')
	for filename in filenames:
		print(filename, end=' ')

	print('\n-------------------------------------------')

显示结果
在这里插入图片描述
在这里插入图片描述

三、zipfile模块

1.读取ZIP文件

对于压缩包里的文件和文件夹,该如何进行操作处理?这里需要使用到zipfile模块。

要读取ZIP文件的内容,首先必须创建一个ZipFile对象。

import zipfile

#【01】读取ZIP文件
exampleZip = zipfile.ZipFile('example.zip')     # 创建ZIP对象
print(exampleZip.namelist())        # 返回ZIP中所有文件和文件夹的列表

spamInfo = exampleZip.getinfo('spam.txt')    # 获取ZIP的单个内容
print(spamInfo.file_size)               # 原文件大小
print(spamInfo.compress_size)     # 压缩后文件大小

c_ratio = round(spamInfo.file_size/spamInfo.compress_size, 2)  # 计算压缩率
print(c_ratio)

运行代码,看一下结果
在这里插入图片描述

总结一下方法和属性:

  • zipfile.ZipFile() 创建ZIP对象
  • namelist() 返回ZIP文件中所有文件和文件夹的字符串的列表
  • getInfo() 返回特定文件的ZipInfo对象
  • file_size属性 原文件的大小
  • compress_size属性 压缩后文件的大小
  • close() 关闭ZIP文件

——

2.解压缩ZIP文件

关于能够解压缩ZIP文件的函数有两个:

  • extractall() 从ZIP文件中解压缩所有文件和文件夹
  • extract() 从ZIP文件中解压缩单个指定文件
import zipfile, os

#【02】从ZIP文件中解压缩
exampleZip.extractall()               # 将所有文件和文件夹解压到当前工作目录中,括号中可指定文件夹名
exampleZip.extract('spam.txt', r'E:\【05】编程设计\Python\Python自动化办公') # 将指定文件解压到指定文件夹(文件夹不存在则创建)
exampleZip.close()

——

3.创建和添加ZIP文件

要创建新的ZIP文件,必须以“写模式”或者“添加模式”打开ZipFile对象,即传入第二参数。

import zipfile, os
#【03】创建和添加到ZIP文件
newZip = zipfile.ZipFile('new.zip','w')     # 以"写模式"或者"添加模式"创建,这里'w'表示写模式
newZip.write('spam.txt', compress_type=zipfile.ZIP_DEFLATED)   # 第二参数为压缩类型参数,可以总是设置为该值

newZip.close()

在这里插入图片描述在这里插入图片描述

发布了35 篇原创文章 · 获赞 35 · 访问量 2739

猜你喜欢

转载自blog.csdn.net/nilvya/article/details/104353383