2015-09-17 20 views
9

Sto cercando di comprimere una directory chiamata test_dicoms in un file zip denominato test_dicoms.zip utilizzando il seguente codice:compressione directory utilizzando shutil.make_archive(), preservando la struttura delle directory

shutil.make_archive('/home/code/test_dicoms','zip','/home/code/test_dicoms')

Il problema è che quando Lo decomprimo, tutti i file che erano invengono estratti a /home/code/ invece della cartella /test_dicoms/ e tutti i file contenuti vengono estratti in /home/code/. Quindi /test_dicoms/ ha un file chiamato foo.txt e dopo che ho zip e decomprimo il percorso di foo.txt è /home/code/foo.txt in contrapposizione a /home/code/test_dicoms/foo.txt. Come posso risolvere questo? Inoltre, alcune delle directory con cui lavoro sono molto grandi. Dovrò aggiungere qualcosa al mio codice per renderlo ZIP64 o la funzione è abbastanza intelligente da farlo automaticamente?

Ecco cosa c'è attualmente in archivio creato:

[[email protected] gwarner]$ unzip -l test_dicoms.zip 
Archive: test_dicoms.zip 
Length Date  Time Name 
--------- ---------- ----- ---- 
    93324 09-17-2015 16:05 AAscout_b_000070 
    93332 09-17-2015 16:05 AAscout_b_000125 
    93332 09-17-2015 16:05 AAscout_b_000248 
+0

Fornire una della copia incollare la directory zip. Ad esempio, se si utilizza Linux, eseguire 'unzip -l test_dicoms.zip'. –

+0

'[gwarner @ jazz gwarner] $ unzip -l test_dicoms.zip Archive: test_dicoms.zip Lunghezza Data Ora Nome --------- ---------- - ---- ---- 93324 09-17-2015 16:05 AAscout_b_000070 93332 09-17-2015 16:05 AAscout_b_000125 93332 09-17-2015 16:05 AAscout_b_000248' –

risposta

14

Usando i termini della documentazione, è stato specificato un root_dir, ma non un base_dir. Provare a specificare il base_dir in questo modo:

shutil.make_archive('/home/code/test_dicoms', 
        'zip', 
        '/home/code/', 
        'test_dicoms') 

Per rispondere alla tua seconda domanda, dipende dalla versione di Python che si sta utilizzando. A partire da Python 3.4, le estensioni ZIP64 saranno disponibili per impostazione predefinita. Prima di Python 3.4, make_archive non creerà automaticamente un file con estensioni ZIP64. Se si utilizza una versione precedente di Python e si desidera ZIP64, è possibile richiamare direttamente lo zipfile.ZipFile() sottostante.

Se si sceglie di utilizzare zipfile.ZipFile() direttamente, bypassando shutil.make_archive(), ecco un esempio:

import zipfile 
import os 

d = '/home/code/test_dicoms' 

os.chdir(os.path.dirname(d)) 
with zipfile.ZipFile(d + '.zip', 
        "w", 
        zipfile.ZIP_DEFLATED, 
        allowZip64=True) as zf: 
    for root, _, filenames in os.walk(os.path.basename(d)): 
     for name in filenames: 
      name = os.path.join(root, name) 
      name = os.path.normpath(name) 
      zf.write(name, name) 

Riferimento:

+1

chiarire intendi di "invocare il sottostante' zipfile.ZipFile() 'direttamente"? – martineau

+0

Esempio aggiunto .. –

+0

una nota che python 3.4+ ha shutil che supporta zip64 per impostazione predefinita http://bugs.python.org/issue17189 – aforaudrey