Extrahieren Sie Zip-Dateien rekursiv mit Python

** Hinzugefügt am 1. Juni 2017 ** Korrigierte Kommentare von @ kota9 und @ pashango2

Einführung

Ich schreibe zum ersten Mal einen Artikel. Als Hintergrund, als ich die für die Recherche erforderlichen Daten herunterlud, befand sich eine Zip-Datei in der Zip-Datei, die wieder wie eine Zip-Datei strukturiert war. Deshalb habe ich ein Skript geschrieben, das sie automatisch erweitert. Es war, weil ich darüber nachdachte. Für Anfänger werde ich den Code auch in den Prozess einführen, über den ich nachgedacht habe. Wenn Sie es sich leisten können, schauen Sie sich einfach den letzten Code an.

Kommentar

1. Zielen Sie mit diesem Skript

-Extrahieren Sie die Zip-Datei rekursiv -Erlauben Sie die Ausführung, auch wenn ein Verzeichnis angegeben ist -Automatisch löschen Sie die entpackte Zip-Datei

2. Prozessablauf

Notieren Sie den allgemeinen Verarbeitungsfluss.

(1) Überprüfen Sie, ob das Befehlszeilenargument eine Zip-Datei oder ein Verzeichnis ist (2) Ausnahmebehandlung

(3) Wenn es sich um eine Zip-Datei handelt (3.1) Extrahieren Sie die angegebene Zip-Datei (3.2) Löschen Sie die Zip-Datei nach dem Extrahieren

(4) Wenn es sich um ein Verzeichnis handelt (4.1) Führen Sie (3) für die Zip-Datei im Verzeichnis aus (4.2) Wiederholen Sie (4) für die Verzeichnisse im Verzeichnis

(4) ist etwas schwer zu verstehen, aber es geht darum, die Zip-Datei zu extrahieren. Wenn es sich um ein Verzeichnis handelt, suchen Sie erneut nach der darin enthaltenen Zip-Datei. Da es sich bei der entpackten Zip-Datei möglicherweise um ein Verzeichnis handelt, hielt ich es für effizienter, die Zip-Datei zu entpacken, bevor Sie mit der Verzeichnissuche fortfahren. (Siehe unten)

3. Tatsächlicher Code

(1) Überprüfen Sie, ob das Befehlszeilenargument eine Zip-Datei oder ein Verzeichnis ist

Die diesmal angenommene Ausführungsanweisung lautet

$ python expand_zip.py ZIP_FILE_NAME

Oder

$ python expand_zip.py DIR_NAME

Daher ist es notwendig, den Prozess abhängig davon zu ändern, welcher ausgeführt wurde.

expand_zip.py


# -*- coding: utf-8 -*-
import os
import sys


if __name__ == "__main__":
    args = sys.argv
    if(os.path.isdir(args[1])):
        #Wenn das Verzeichnis eingegeben wird
    else:
        #Wenn eine Zip-Datei eingegeben wird

(2) Ausnahmebehandlung

Eine Ausnahmeverarbeitung ist erforderlich, da Eingaben vom Benutzer akzeptiert werden. Ich bin auch hier nicht daran gewöhnt, bitte korrigieren Sie es, wenn Sie einen Fehler machen.

expand_zip.py


# -*- coding: utf-8 -*-
import os
import sys


if __name__ == "__main__":
    args = sys.argv
    try:
        if(os.path.isdir(args[1])):
            #Wenn das Verzeichnis eingegeben wird
        else:
            #Wenn eine Zip-Datei eingegeben wird
    except IndexError:
        print('IndexError: Usage "python %s ZIPFILE_NAME" or "python %s DIR_NAME"' % (args[0], args[0]))
    except IOError:
        print('IOError: Couldn\'t open "%s"' % args[1])

(3) Wenn es sich um eine Zip-Datei handelt

(3.1) Extrahieren Sie die angegebene Zip-Datei

expand_zip.py


# -*- coding: utf-8 -*-
import os
import sys
import zipfile


def unzip(filename):
    with zipfile.ZipFile(filename, "r") as zf:
        zf.extractall(path=os.path.dirname(filename))


if __name__ == "__main__":
    args = sys.argv
    try:
        if(os.path.isdir(args[1])):
            #Wenn das Verzeichnis eingegeben wird
        else:
            unzip(os.path.join(args[1]))
    except IndexError:
        print('IndexError: Usage "python %s ZIPFILE_NAME" or "python %s DIR_NAME"' % (args[0], args[0]))
    except IOError:
        print('IOError: Couldn\'t open "%s"' % args[1])

** zf.extractall (Pfad) ** extrahiert die Zip-Datei an den Pfad. Dieses Mal werde ich es an den Speicherort extrahieren, an dem die Zip-Datei ursprünglich vorhanden war.

(3.2) Löschen Sie die Zip-Datei nach dem Extrahieren

expand_zip.py


# -*- coding: utf-8 -*-
import os
import sys
import zipfile


def unzip(filename):
    with zipfile.ZipFile(filename, "r") as zf:
        zf.extractall(path=os.path.dirname(filename))
    delete_zip(filename)


def delete_zip(zip_file):
    os.remove(zip_file)


if __name__ == "__main__":
    args = sys.argv
    try:
        if(os.path.isdir(args[1])):
            #Wenn das Verzeichnis eingegeben wird
        else:
            unzip(os.path.join(args[1]))
    except IndexError:
        print('IndexError: Usage "python %s ZIPFILE_NAME" or "python %s DIR_NAME"' % (args[0], args[0]))
    except IOError:
        print('IOError: Couldn\'t open "%s"' % args[1])

(4) Wenn es sich um ein Verzeichnis handelt

(4.1) Führen Sie (3) für die Zip-Datei im Verzeichnis aus

expand_zip.py


# -*- coding: utf-8 -*-
import os
import sys
import zipfile
import glob


def unzip(filename):
    with zipfile.ZipFile(filename, "r") as zf:
        zf.extractall(path=os.path.dirname(filename))
    delete_zip(filename)


def delete_zip(zip_file):
    os.remove(zip_file)


def walk_in_dir(dir_path):
    for filename in glob.glob(os.path.join(dir_path, "*.zip")):
        unzip(filename=os.path.join(dir_path,filename))


if __name__ == "__main__":
    args = sys.argv
    try:
        if(os.path.isdir(args[1])):
            walk_in_dir(args[1])
        else:
            unzip(os.path.join(args[1]))
    except IndexError:
        print('IndexError: Usage "python %s ZIPFILE_NAME" or "python %s DIR_NAME"' % (args[0], args[0]))
    except IOError:
        print('IOError: Couldn\'t open "%s"' % args[1])

In der Anweisung ~~ for ruft ** os.listdir (dir_path) ** alle Dateien und Verzeichnisse in dir_path ab und dann ** wenn os.path.isfile (os.path.join (dir_path ,,) f)) ** erhält nur die darin enthaltenen Dateien und das letzte **, wenn u ".zip" in f ** die mit der Erweiterung .zip. ~~

** Hinzugefügt am 1. Juni 2017 ** Als Antwort auf den Kommentar von @ pashango2

for filename in (f for f in os.listdir(dir_path) if os.path.isfile(os.path.join(dir_path, f)) if u".zip" in f):

Die Beschreibung

for filename in glob.glob(os.path.join(dir_path, "*.zip")):

Gewechselt zu.

** Nachtrag zu hier **

(4.2) Wiederholen Sie (4) für die Verzeichnisse im Verzeichnis

expand_zip.py


# -*- coding: utf-8 -*-
import os
import sys
import zipfile
import glob


def unzip(filename):
    with zipfile.ZipFile(filename, "r") as zf:
        zf.extractall(path=os.path.dirname(filename))
    delete_zip(filename)


def delete_zip(zip_file):
    os.remove(zip_file)


def walk_in_dir(dir_path):
    for filename in glob.glob(os.path.join(dir_path, "*.zip")):
        unzip(filename=os.path.join(dir_path,filename))

    for dirname in (d for d in os.listdir(dir_path) if os.path.isdir(os.path.join(dir_path, d))):
        walk_in_dir(os.path.join(dir_path, dirname))


if __name__ == "__main__":
    args = sys.argv
    try:
        if(os.path.isdir(args[1])):
            walk_in_dir(args[1])
        else:
            unzip(os.path.join(args[1]))
    except IndexError:
        print('IndexError: Usage "python %s ZIPFILE_NAME" or "python %s DIR_NAME"' % (args[0], args[0]))
    except IOError:
        print('IOError: Couldn\'t open "%s"' % args[1])

Der Grund, warum die Zip-Datei im Verzeichnis erweitert und dann für alle Verzeichnisse im Verzeichnis rekursiv verarbeitet wird, besteht darin, dass das Extraktionsergebnis der Zip-Datei möglicherweise ein Verzeichnis ist, also diese Reihenfolge Es ist geworden.

Wenn in diesem Code das angegebene Befehlszeilenargument eine Zip-Datei ist, wird es in (3) erweitert und beendet, sodass es als Ziel für die Wiederholung aufgeführt werden muss.

Der endgültige Code lautet also

expand_zip.py


# -*- coding: utf-8 -*-
import os
import sys
import zipfile
import glob


def unzip(filename):
    with zipfile.ZipFile(filename, "r") as zf:
        zf.extractall(path=os.path.dirname(filename))
    delete_zip(filename)


def delete_zip(zip_file):
    os.remove(zip_file)


def walk_in_dir(dir_path):
    for filename in glob.glob(os.path.join(dir_path, "*.zip")):
        unzip(filename=os.path.join(dir_path,filename))

    for dirname in (d for d in os.listdir(dir_path) if os.path.isdir(os.path.join(dir_path, d))):
        walk_in_dir(os.path.join(dir_path, dirname))


if __name__ == "__main__":
    args = sys.argv
    try:
        if(os.path.isdir(args[1])):
            walk_in_dir(args[1])
        else:
            unzip(os.path.join(args[1]))
            name, _ = os.path.splitext(args[1])
            if (os.path.isdir(name)):
                walk_in_dir(name)
    except IndexError:
        print('IndexError: Usage "python %s ZIPFILE_NAME" or "python %s DIR_NAME"' % (args[0], args[0]))
    except IOError:
        print('IOError: Couldn\'t open "%s"' % args[1])

Wird sein.

Zusammenfassung

Dies war mein erster Beitrag, aber es wird eine gute Gelegenheit sein, mein Wissen zu organisieren, daher möchte ich auch in Zukunft weiter posten. Wenn Sie in diesem Artikel Fehler finden, korrigieren Sie diese bitte.

Recommended Posts

Extrahieren Sie Zip-Dateien rekursiv mit Python
Zip, entpacken mit Python
Behandeln Sie Zip-Dateien mit japanischen Dateinamen in Python 3
Sortieren von Bilddateien mit Python (2)
Sortieren Sie große Dateien mit Python
Sortieren von Bilddateien mit Python (3)
Bilddateien mit Python sortieren
Integrieren Sie PDF-Dateien in Python
TXT-Dateien mit Python lesen
Bearbeiten von EAGLE .brd-Dateien mit Python
[Python] POST-WAV-Dateien mit Anforderungen [POST]
Mit OpenSSL mit Python 3 verschlüsselte Dateien entschlüsseln
Behandeln Sie Excel-CSV-Dateien mit Python
Lesen Sie Dateien parallel zu Python
Python Zip
Sammle Wikipedia-Links rekursiv mit Python
Spielen Sie eine Audiodatei von Python mit Interrupt ab
Mit openssl verschlüsselte Dateien werden mit openssl aus Python entschlüsselt
Lesen und Schreiben von JSON-Dateien mit Python
Laden Sie mit Python Dateien im Web herunter
[Easy Python] Lesen von Excel-Dateien mit openpyxl
[Easy Python] Lesen von Excel-Dateien mit Pandas
FizzBuzz in Python3
Scraping mit Python
Statistik mit Python
Scraping mit Python
Python mit Go
Twilio mit Python
In Python integrieren
Spielen Sie mit 2016-Python
AES256 mit Python
Getestet mit Python
Python beginnt mit ()
mit Syntax (Python)
Bingo mit Python
Zundokokiyoshi mit Python
Excel mit Python
Mikrocomputer mit Python
Mit Python besetzen
[Python] Holen Sie sich die Dateien mit Python in den Ordner
Durchsuchen Sie rekursiv alle Dateien mit mehreren angegebenen Erweiterungen
Ziehen Sie eine lokale Datei mit Selenium (Python) per Drag & Drop.
Zeichenkodierung beim Umgang mit Dateien in Python 3
Laden Sie Dateien mit Lambda (Python) auf Google Drive hoch.
Zip mit Python extrahieren (unterstützt japanische Dateinamen)
Lesen und Schreiben passt Dateien mit Python (Memo)
Konvertieren Sie mehrere Protodateien gleichzeitig mit Python
Lesen Sie WAV-Dateien nur mit dem Python-Standardpaket
Entpacken Sie alle Zip-Dateien im aktuellen Verzeichnis
Serielle Kommunikation mit Python
Django 1.11 wurde mit Python3.6 gestartet
Primzahlbeurteilung mit Python
Python mit Eclipse + PyDev.
Socket-Kommunikation mit Python
Datenanalyse mit Python 2
Laden Sie Dateien mit Django hoch
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Extrahieren Sie die Tabelle der Bilddateien mit OneDrive & Python