使用os.walk提取壓縮檔案並避免遞迴提取

華科雲商小雪發表於2024-02-18

作為一名合格的技術員,在要=使用 os.walk 來提取壓縮檔案並避免遞迴提取,我們可以在遍歷檔案時檢查檔案的副檔名,並且只處理壓縮檔案而非目錄。下面是一個示例程式碼,展示瞭如何使用 os.walk 來實現這一功能,並且避免了遞迴提取。具體的問題下面可以跟著我一起來看看,具體需要的引數以及問題我會一一詳細的解答。

問題背景

在使用 Python 編寫遞迴提取器時,經常會遇到遞迴提取過多,導致效能降低的問題。在以下程式碼中,extractRecursive 函式透過 os.walk 遍歷指定路徑下的所有檔案和目錄,並使用 magic 模組來識別檔案型別。當遇到壓縮檔案時,會呼叫 arcExtract 函式來解壓該檔案。但是,extractRecursive 函式在解壓完成後還會再次呼叫自身,導致遞迴提取過多。


import 
osmagic

m  =  magic. openmagic. 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  extractRecursivepath , archives):
    i = 0
    for  dirpathdirnamesfilenames  in  os. walkpath ):
        for  f  in  filenames:
            fp  =  os. path. joindirpathf )
            i += 1
            print  i
            file_type  =  m. filefp ). 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. Popenargsshell  =  Falsestdout  =  subprocess. PIPEstderr  =  subprocess. PIPE )
        outerr  =  sp. communicate()
        print  outerr
        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 
extractRecursivepath ,
archivesextracted_archives
=
None):

    i  =  0
    if  not  extracted_archives:
        extracted_archives  =  set()

    for  dirpathdirnamesfilenames  in  os. walkpath ):
        for  f  in  filenames:
            fp  =  os. path. joindirpathf )
            i += 1
            print  i
            file_type  =  m. filefp ). split"," )[ 0]
            if  file_type  in  archives  and  fp  not  in  extracted_archives:
                extracted_archives. add( fp)
                extracted_in. add( dirpath)
                arcExtract( fpfile_typepathTrue)

    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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章