使用os.walk提取壓縮檔案並避免遞迴提取
os.walk
來提取壓縮檔案並避免遞迴提取,我們可以在遍歷檔案時檢查檔案的副檔名,並且只處理壓縮檔案而非目錄。下面是一個示例程式碼,展示瞭如何使用
os.walk
問題背景
在使用 Python 編寫遞迴提取器時,經常會遇到遞迴提取過多,導致效能降低的問題。在以下程式碼中,extractRecursive 函式透過 os.walk 遍歷指定路徑下的所有檔案和目錄,並使用 magic 模組來識別檔案型別。當遇到壓縮檔案時,會呼叫 arcExtract 函式來解壓該檔案。但是,extractRecursive 函式在解壓完成後還會再次呼叫自身,導致遞迴提取過多。
import os, magic
m = magic. open( magic. MAGIC_NONE )
m. load()
archive_type = [ 'gzip compressed data',
'7-zip archive data',
'Zip archive data',
'bzip2 compressed data',
'tar archive',
'POSIX tar archive',
'POSIX tar archive (GNU)',
'RAR archive data',
'Microsoft Outlook email folder (>=2003)',
'Microsoft Outlook email folder']
def extractRecursive( path , archives):
i = 0
for dirpath, dirnames, filenames in os. walk( path ):
for f in filenames:
fp = os. path. join( dirpath, f )
i += 1
print i
file_type = m. file( fp ). split( "," )[ 0]
if file_type in archives:
arcExtract( fp, file_type, path, True)
extractRecursive( path, archives) # 遞迴呼叫自身
return "Done"
def arcExtract( file_path, file_type, extracted_path = "/home/v3ss/Downloads/extracted", unlink = False):
import subprocess, shlex
if file_type in pst_types:
cmd = "readpst -o '%s' -S '%s'" % ( extracted_path, file_path)
else:
cmd = "7z -y -r -o%s x '%s'" % ( extracted_path, file_path)
print cmd
args = shlex. split( cmd)
print args
try:
sp = subprocess. Popen( args, shell = False, stdout = subprocess. PIPE, stderr = subprocess. PIPE )
out, err = sp. communicate()
print out, err
ret = sp. returncode
except OSError:
print "Error no %s Message %s" % ( OSError. errno, OSError. message)
pass
if ret == 0:
if unlink == True:
os. unlink( file_path)
return "OK!"
else:
return "Failed"
if __name__ == '__main__':
extractRecursive( 'Path/To/Archives' , archive_type)
解決方案
為了避免遞迴提取過多,我們只需要修改 extractRecursive 函式,不再在解壓完成後再次呼叫自身。
def extractRecursive( path , archives, extracted_archives = None):
i = 0
if not extracted_archives:
extracted_archives = set()
for dirpath, dirnames, filenames in os. walk( path ):
for f in filenames:
fp = os. path. join( dirpath, f )
i += 1
print i
file_type = m. file( fp ). split( "," )[ 0]
if file_type in archives and fp not in extracted_archives:
extracted_archives. add( fp)
extracted_in. add( dirpath)
arcExtract( fp, file_type, path, True)
for path in extracted_in:
# 不再遞迴呼叫自身
# extractRecursive(path, archives, extracted_archives)
return "Done"
現在,extractRecursive 函式不再在解壓完成後再次呼叫自身,而是繼續遍歷下一個目錄。這樣就可以避免遞迴提取過多,提高效能。
使用
os.walk
提取壓縮檔案並避免遞迴提取並不難,只要你熟悉Python的檔案操作和
zipfile
模組的基本用法。
os.walk
提供了一種逐級遍歷目錄結構的簡單方法,而
zipfile
模組則可以用來處理壓縮檔案。
主要的挑戰可能在於理解如何在遍歷檔案時過濾出壓縮檔案,並且在解壓縮時避免遞迴提取。但一旦理解了這個概念,編寫相應的程式碼並不複雜。
我已經給出了一個示例程式碼,演示瞭如何使用
os.walk
和
zipfile
模組來實現這一功能。你可以參考該示例並根據需要進行調整。如果有任何困難或疑問,隨時向我提問,我會盡力幫助你解決問題。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70034537/viewspace-3006680/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- !!!提取檔案記錄!!!
- 如何使用htmlq提取html檔案內容HTML
- 使用JMeter的JSON提取器:透過遞迴下降查詢,從介面響應中提取特定欄位JMeterJSON遞迴
- 檔案壓縮和解壓縮
- 使用Rust的ripunzip和rayon並行解壓縮檔案Rust並行
- File Juicer for Mac(檔案提取工具)UIMac
- 製作ISO檔案 與 提取ISO檔案
- 使用java API進行zip遞迴壓縮資料夾以及解壓JavaAPI遞迴
- vscode外掛:檔案樹提取器VSCode
- betterzip怎麼解壓檔案?如何使用BetterZip批次解壓壓縮檔案
- .NET 壓縮/解壓檔案
- python 如何解析.saz 檔案並提取其中的 post 報文Python
- 檔名提取、修改
- 大模型原理:遞迴、壓縮和模式匹配大模型遞迴模式
- gulp壓縮檔案
- Linux 檔案壓縮Linux
- Linux中檔案的壓縮和解壓縮Linux
- 電腦怎麼壓縮檔案 檔案壓縮方法詳解
- Laravel 中建立 Zip 壓縮檔案並提供下載Laravel
- 批處理 壓縮zip 並過濾部分檔案
- 流量中提取檔案的若干種方法
- Mac壓縮檔案怎麼加密?BetterZip加密Word壓縮檔案教程Mac加密
- 在Mac電腦上如何對 Brotli格式進行壓縮與提取Mac
- linux檔案壓縮和解壓命令Linux
- php檔案操作之提取檔案/目錄的名稱PHP
- Ubuntu 壓縮檔案命令Ubuntu
- c#壓縮檔案C#
- 使用libzip壓縮檔案和資料夾
- 如何使用Commander One Mac來壓縮檔案?Mac
- 【Go】使用壓縮檔案優化io (二)Go優化
- 【Go】使用壓縮檔案優化io (一)Go優化
- 【Go】使用壓縮檔案優化 io (一)Go優化
- EXPAND命令是Windows作業系統中的一個命令列工具,用於解壓縮檔案。它可以將Windows壓縮檔案(.cab)中的檔案提取到指定的目錄中。EXPAND命令通常用於在命令列中執行解壓縮操作,而不需要使用圖形介面中的壓縮工具。Windows作業系統命令列
- 怎麼把pdf檔案縮小?如何使用PDF Expert壓縮pdf檔案大小?
- Python提取文字檔案(.txt)資料的方法Python
- linux 下面壓縮、解壓.rar檔案Linux
- 將bmp檔案壓縮為jpg檔案
- php 建立壓縮包zip,並將指定檔案放入zip中PHP