【Python】文件的选择性压缩和全压缩,一般人不告诉的实用小技巧!
ZipFile模块是Python中专门文文件打包而生的模块,在文件打包时应该与os.path()模块配合使用
最近Python在各大社交媒体被炒得那是一个如火如荼呀,很多大灰狼几个其他领域的朋友都过来问我关于Python的学习,尤其是在自动化办公领域的用途。
但的确也不可否认,Python在自动化办公领域的显著优越性也是不可小视的,今天正好用到了Python对文件的自动化压缩,然后就在这里记录一下。
我们在日常办公中经常会将文件进行压缩处理,然后方便发送给邮箱等,同时对文件的压缩也是对文件很好的一个备份处理,那么今天大灰狼就来和大家聊一聊在Python中文件压缩的哪些事儿。
在Python中对文件进行压缩时,需要用到的第三方模块是ZipFile模块,从这个名字就可以看出,这个模块可以说就是为文件的压缩而生的。
使用ZipFile模块对文件进行压缩时需要注意的几点:
一、zipfile.ZipFile()
这个模块的作用和os.open()有几分相似,os.open()是打开一个文件或文件夹,如果没有则创建;zipfile.ZipFile()的作用则是打开一个压缩包文件,如果没有则创建一个该压缩包文件,同时与os.open()相同的地方还有:在函数的参数里面都要加‘w’或‘a’,也就是进行相应的写操作。
如下边这个代码:
zipfile.ZipFile(‘Text.zip’, ‘w’)
#以写模式打开Text.zip文件,若Text.zip文件不存在则创建该文件
``
二、Zipfile下的write()方法
同样,该方法和os.write()方法相似,都是在该文件中写入内容。
但值得注意的是,Zipfile下的write()方法写入的是文件夹或文件,而不是某一行文字或内容。
如下面这一行代码:
zipfiles.write(filenames)
#在压缩文件zipfiles中写入filenames下的文件,
在这里大灰狼建议write()的括号中传入的参数最好是该文件的绝对路径,目的是为了方便程序对该文件进行压缩,不至于因找不到该文件而出错。
os.walk(path)方法
同时还有一个比较重要的方法是OS.walk()方法,
在这里介绍一下该方法的作用,os.walk(path)方法传入的一个文件夹的绝对路径,并且该方法有三个返回值:
- 当前文件夹名称的字符串
- 当前文件的子文件夹的字符串的列表
- 当前文件夹中文件的字符串的列表
搞清楚了这三个问题,接下来就是编写代码的阶段了,
同在进行文件压缩的时候,我们有时候希望对整个文件夹进行压缩,而有些时候我们则希望对该文件夹中的某一类型的文件进行压缩,如对文件中的所有.txt文件进行压缩。
所以为了方便小伙伴们直接调用,我将这两种情况分别写成了两个函数形式,在调用的时候只需要向该函数中传入你想要压缩的文件夹的路径即可。
压缩该路径下的所有文件
import os
import zipfile
path1 = 'D:dmp'
#文件压缩函数
def fileToZip(path):
path = path.split('\')
path[0] = path[0][-2: len(path[0])]
path = '/'.join(path)
number = 1
while (True):
fileName = os.path.basename(path1) + '_' + str(number) + '.zip'
if not os.path.exists(fileName):
break
number += 1
zipfiles = zipfile.ZipFile(fileName, 'w')
for foldername, subfolder, filename in os.walk(path):
print('文件夹:%s' % (foldername))
for subfoldername in subfolder:
print('子文件夹:%s/%s' % (foldername, subfoldername))
#zipfiles.write(os.path.join(foldername, subfoldername))
for filenames in filename:
print('子文件:%s/%s' % (foldername, filenames))
#if filenames.endswith('.txt'): #判断文件是否为.txt后缀
zipfiles.write(os.path.join(foldername, filenames))
zipfiles.close()
fileToZip(path1)
只压缩文件夹中的特定文件
在代码中可将判断语句进行修改成其他文件,如.py ,xlsx等
import os
import zipfile
path1 = 'D:dmp'
#文件压缩函数
def fileToZip(path):
path = path.split('\')
path[0] = path[0][-2: len(path[0])]
path = '/'.join(path)
number = 1
while (True):
fileName = os.path.basename(path1) + '_' + str(number) + '.zip'
if not os.path.exists(fileName):
break
number += 1
zipfiles = zipfile.ZipFile(fileName, 'w')
for foldername, subfolder, filename in os.walk(path):
print('文件夹:%s' % (foldername))
for subfoldername in subfolder:
print('子文件夹:%s/%s' % (foldername, subfoldername))
#zipfiles.write(os.path.join(foldername, subfoldername))
for filenames in filename:
print('子文件:%s/%s' % (foldername, filenames))
'''判断是否是.txt后缀的文件'''
if filenames.endswith('.txt'): #判断文件是否为.txt后缀
zipfiles.write(os.path.join(foldername, filenames))
zipfiles.close()
fileToZip(path1) #调用函数
函数的前三行是大灰狼为了避免传入的是u202a格式的路径而做的一个小处理,对这一点不懂的小伙伴可以看我的这篇文章:惊!u202a错误,百分之九十都不知道的隐藏在文件路径里的惊天秘密!(干货收藏)
觉得不错记得点赞关注哟!
- Hibernate_day02总结
- Hibernate_day01总结
- ADG备库批量查询失败的原因分析(r8笔记第33天)
- 通过外部表改进一个繁琐的大查询 (r8笔记第32天)
- 一个简单的bigfile tablespace无法扩展的案例处理 (r8笔记第31天)
- 测试环境的迁移式升级和数据整合(r8笔记第27天)
- 增量数据丢失的原因分析(r8笔记第26天)
- Java全栈开发Spring学习第三天
- 一个oracle bug的简单验证(r8笔记第45天)
- 批量导出csv文件的基本尝试(r8笔记第44天)
- Golang 中的并发限制与超时控制
- 一条简单的报警信息发现的oracle bug(r8笔记第42天)
- 一条insert语句导致的性能问题分析(一)(r8笔记第40天)
- 一条insert语句导致的性能问题分析(二)(r8笔记第43天)
- 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 数组属性和方法
- MyBatis预编译机制详解
- ActiveMQ NMS使用过程中的一点经验
- asp.net core 认证及简单集群
- WebAPI问题追踪日志记录过滤器
- 使用责任链模式消除if分支实践
- sql操作知识点个人笔记(SQLServer篇)
- kettle学习笔记(二)——kettle基本使用
- Spring源码深度解析(二)
- Repository个人实践
- 摩斯码编解码器
- kettle学习笔记(三)——kettle资源库、运行方式与日志
- 使用Let's Encrypted HPPTS你的网站
- .net core web api + Autofac + EFCore 个人实践
- kettle学习笔记(六)——kettle转换步骤
- 记一次带层级结构列表数据计算性能优化