使用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- !!!提取檔案記錄!!!
- Java使用執行緒池遞迴壓縮資料夾下面的所有子檔案Java執行緒遞迴
- 如何使用htmlq提取html檔案內容HTML
- 使用gzip壓縮檔案
- 使用JMeter的JSON提取器:透過遞迴下降查詢,從介面響應中提取特定欄位JMeterJSON遞迴
- 檔案壓縮和解壓縮
- 提取Windows使用者金鑰檔案cachedumpWindows
- 用 Huffman 樹實現檔案壓縮並解壓
- CAB歸檔檔案提取工具cabextract
- 使用Rust的ripunzip和rayon並行解壓縮檔案Rust並行
- 使用compress壓縮檔案
- File Juicer for Mac(檔案提取工具)UIMac
- nmap掃描檔案提取工具
- 從配置檔案中提取IP
- 提取rpm檔案內容
- 製作ISO檔案 與 提取ISO檔案
- 使用java API進行zip遞迴壓縮資料夾以及解壓JavaAPI遞迴
- betterzip怎麼解壓檔案?如何使用BetterZip批次解壓壓縮檔案
- 縮圖資訊提取工具vinetto
- .NET 壓縮/解壓檔案
- gulp壓縮檔案
- Java檔案壓縮Java
- java 檔案壓縮Java
- aix 檔案的壓縮與解壓縮AI
- 在Mac電腦上如何對 Brotli格式進行壓縮與提取Mac
- 【PL/SQL】遊標提取迴圈SQL
- 電腦怎麼壓縮檔案 檔案壓縮方法詳解
- Laravel 中建立 Zip 壓縮檔案並提供下載Laravel
- 批處理 壓縮zip 並過濾部分檔案
- 流量中提取檔案的若干種方法
- python 如何解析.saz 檔案並提取其中的 post 報文Python
- Linux中檔案的壓縮和解壓縮Linux
- Mac壓縮檔案怎麼加密?BetterZip加密Word壓縮檔案教程Mac加密
- php檔案操作之提取檔案/目錄的名稱PHP
- Ubuntu 壓縮檔案命令Ubuntu
- c#壓縮檔案C#
- Linux 檔案壓縮Linux
- HTTP 之 檔案壓縮HTTP