文件的选择性压缩和全压缩,一般人不告诉的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)方法传入的一个文件夹的绝对路径,并且该方法有三个返回值:

  1. 当前文件夹名称的字符串

  2. 当前文件的子文件夹的字符串的列表

  3. 当前文件夹中文件的字符串的列表

搞清楚了这三个问题,接下来就是编写代码的阶段了,

同在进行文件压缩的时候,我们有时候希望对整个文件夹进行压缩,而有些时候我们则希望对该文件夹中的某一类型的文件进行压缩,如对文件中的所有.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错误,百分之九十都不知道的隐藏在文件路径里的惊天秘密!(干货收藏)

==觉得不错记得点赞关注哟!==

==大灰狼期待与你一同进步!==

在这里插入图片描述

(完)