2016-07-02 6 views
1

ich in jedem von 500 ZipFiles nur eine Unterdatei benötigen, die Wege sind die gleichen, wie:Wie kopiere ich eine Datei in einer Zip-Datei in ein bestimmtes Verzeichnis?

120132.zip/A/B/C/target_file 
212332.zip/A/B/C/target_file 
.... 

Wie kann ich alle diese Zieldateien in ein Verzeichnis kopieren? die gesamten Wege in das neue Verzeichnis zu halten wird die beste sein, was ich meine, ist:

target_dir/ 
    120132/A/B/C/target_file 
    212332/A/B/C/target_file 
    ...... 

Ich versuchte es mit Python-Modulen zipfile und shutil

jedoch kopie von shutil nimmt den gesamten Pfad als Argument, aber wenn ich versuchte, die Zieldatei direkt zu kopieren, wird es feilenotfind Fehler auslösen. Beim Entpacken durch die Datei zipfile.Zipfile wird auf die Zieldatei zugegriffen, aber copyfile wird ungültig.

Wie kann ich das richtig und effizient machen?

Antwort

3

ZipFile.extract nimmt optional path Angabe in welchem ​​Verzeichnis sie Datei extrahieren:

import os 
import zipfile 

zip_filepath = ['120132.zip', '212332.zip', ...] # or glob.glob('...zip') 
target_dir = '/path/to/target_dir' 

for path in zip_filepath: 
    with zipfile.ZipFile(path) as zf: 
     dirname = os.path.join(
      target_dir, os.path.splitext(os.path.basename(path))[0] 
     ) 
     zf.extract('A/B/C/target_file', path=dirname) 
+0

Ja! Das ist total was ich will! extract() macht Sinn. Vielen Dank! – Spike

+0

Ich laufe auf ein anderes Problem. Ich habe "zf.extract (r" A \ B \ C \ Dateiname ", ..)" unter Windows ausgeführt, aber es ist fehlgeschlagen und hat gesagt: "Es gibt kein Element namens 'A \\\\ B \\\\ C \\ \\Dateiname'". Könnten Sie mir einen Rat geben? @falsetru – Spike

+0

@Spike, Sind Sie sicher, dass alle Zip-Dateien diese Datei enthalten? Schlägt es von Anfang an fehl? Sie müssen es möglicherweise überprüfen, bevor Sie 'extract' aufrufen oder' try ... except ...' verwenden. – falsetru

Verwandte Themen