python 批量解壓zip檔案

2021-09-26 08:06:34 字數 3553 閱讀 7707

這是乙個用python寫解壓大量zip指令碼的說明,本人新手乙個,希望能對各位有所啟發。

首先要注意的,在執行自己的指令碼之前一定先備份或者複製出一些樣本進行測試,不然出錯會很麻煩;

之後我用到的是解壓zip檔案的擴充套件包zipfile,可以直接pip安裝或者在ide裡安裝,需要特別注意的是這個包的檔名解碼方式需要我們去修改,先去檢視原始檔,直接搜尋「cp437」(乙個編碼方式),找到後全部替換為「gbk」,即可解決中文顯示問題。

**:

如果你對python感興趣,我這有個學習python基地,裡面有很多學習資料,感興趣的+q群:688244617

import os

import shutil

import zipfile

# 首先引入需要的工具包

# shutil為後期移動檔案所需,可以忽略此項

# 路徑改這裡!

parent_path = r'輸入路徑,會解壓該路徑下的所有zip壓縮檔案'

# 檔案型別選擇

# 可以自行更改壓縮檔案型別,需要引入其它工具包,如tarfile等

# 這裡是因為在自己的windows上,zip比較常見,其他型別請自行更改

file_flag =

'.zip'

# 刪除已解壓的zip檔案

# 不建議初次使用,在確定程式無誤後可以新增使用

defdel_old_zip

(file_path)

: os.remove(file_path)

# 解壓

defdecompress

(file_path, root)

:# 開始

# zipfile開啟zip檔案

z = zipfile.zipfile(f''

,'r'

)# 解壓

z.extractall(path=f""

)# path為解壓路徑,解包後位於該路徑下

# 判斷是否需要重複解包

for names in z.namelist():

if names.endswith(file_flag)

: z.close(

)return

1# 結束

z.close(

)return

0# 因為我在使用過程中發現有些zip解包後會混在一起

# 在平時大家手動解壓時可能也會遇到提示是否覆蓋的問題

# 下面的兩個函式解決這一問題

# 開始要先建立乙個大資料夾 與壓縮包名字相同

# 避免後期混亂和麻煩

defstart_dir_make

(root, dirname)

: os.chdir(root)

os.mkdir(dirname)

return os.path.join(root, dirname)

# 去除多餘資料夾

defrem_dir_extra

(root, father_dir_name)

:# 遞迴要注意資訊的正常處理 搞不好上乙個呼叫已經改變了東西 而下面的呼叫還是使用之前的資料

try:

# 判斷資料夾重名 開始

for item in os.listdir(os.path.join(root, father_dir_name)):

# 第一步判斷是不是乙個資料夾,如果不是則跳過本次迴圈

ifnot os.path.isdir(os.path.join(root, father_dir_name, item)):

continue

# 判斷是否要脫掉一層目錄結構

# 資料夾名字要相同,且子目錄中只有單獨的乙個資料夾

if item == father_dir_name and

len(

os.listdir(os.path.join(root, father_dir_name)))

==1:# 改變工作目錄

os.chdir(root)

# 將無用資料夾重新命名,因為直接移動會有重名錯誤

os.rename(father_dir_name, father_dir_name +

'-old'

)# 移動檔案後刪除空資料夾

shutil.move(os.path.join(root, father_dir_name +

'-old'

, item)

, os.path.join(root)

) os.rmdir(os.path.join(root, father_dir_name +

'-old'))

# 將去掉一層目錄結構後的資料夾繼續作為父本遞迴處理下去

# 這裡要注意,上面已經發生過資料的改動,所以下面遞迴傳參一定要正確!

rem_dir_extra(root, item)

else

:# 處理那些不滿足上面條件的資料夾

rem_dir_extra(os.path.join(root, father_dir_name)

, item)

except exception as e:

# 列印錯誤資訊

print

("清除資料夾出錯"

+str

(e))

# 入口

if __name__ ==

'__main__':

flag =

1while flag:

# 迴圈遍歷資料夾

for root, dirs, files in os.walk(parent_path)

:# 讀取檔名

for name in files:

if name.endswith(file_flag)

:# 建立資料夾

new_ws = start_dir_make(root, name.replace(file_flag,'')

)# zip檔案位址

zip_path = os.path.join(root, name)

# 解壓

flag = decompress(zip_path, new_ws)

# 刪除解壓後的檔案

# 有點危險

# 但不刪除又可能會重複執行

# 一定要備份或先測試,不然可能會涼,自己選擇修改

del_old_zip(zip_path)

# 去掉多餘的檔案結構

rem_dir_extra(root, name.replace(file_flag,'')

)print

(f'\\'

.join(

['檔案:'

,'\n解壓完成\n'])

)# 由於解壓可能解了好幾次 所以可能會有已經解壓好的父級目錄重名無法處理 這裡要再處理一次

rem_dir_extra(os.path.split(parent_path)[0

], os.path.split(parent_path)[1

])print

("解壓完成啦,記得檢查有沒有zip格式之外的呀!\n\n其他格式需要自己改一下了"

)

python 解壓zip檔案

import os import zipfile import time defunzipfile file dir,file name,filelist param file dir 絕對路徑 param file name 解壓檔名 param filelist 返回解壓後的所有檔名 retur...

Python壓縮解壓zip檔案

import os import shutil import zipfile from os.path import join,getsize一 python壓縮指定資料夾def zip file src dir zip name src dir zip z zipfile.zipfile zip ...

Python解壓zip和rar檔案

更多0 python rarzip 如上篇所說,我要使用python解壓一些檔案,一來就不懂,google到zipfile了,然後又google到rarfile了。rarfile是模仿zipfile模組寫的,所以介面幾乎一樣,只有rar和zip的字元差別。但是zip功能是python內建模組,rar...