【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錯誤,百分之九十都不知道的隱藏在文件路徑裏的驚天祕密!(乾貨收藏)

覺得不錯記得點贊關注喲!

同時你也可以關注我的微信公衆號“灰狼洞主”獲取更多好玩實用的Python項目分享和更多的互聯網資訊!

大灰狼期待與你一同進步!

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章