Pyton Unzip for schleife variable

Gute Links und Tutorials könnt ihr hier posten.
Antworten
sirdistschonweg
User
Beiträge: 1
Registriert: Mittwoch 15. Dezember 2021, 07:41

Ich verwende Python zum Entpacken einer Datei. Diese Datei muss sich in einer Variablen befinden.
Vorgehensweise: Durchsuchen Sie das Verzeichnis 'c:\tempp'. Zeigen Sie die ZIP-Datei an. Entpacken Sie das Verzeichnis.
Löschen Sie die alte ZIP-Datei. Suchen Sie nach einer ZIP-Datei, falls vorhanden, entpacken Sie diese Datei. Löschen Sie die alte ZIP-Datei. Und alles wieder von vorne. Aber vieles funktioniert nicht, wenn ich eine Variable entpacken will.

Code: Alles auswählen

#  import os from zipfile import ZipFile import zipfile
   
   path1 = r "C:\tempp"
   
   startnumber = 0
   
   # create a loop the extract *.zip file while startnumber <= 2021:
       print (startnumber)
       startnumber +=1
       os.chdir('c:\tempp')
       import glob
       print("Current working directory: {0}".format(os.getcwd()))
       zipps = glob.glob('*.zip')
       print(zipps)
       with ZipFile(zipps, 'r') as zipObj:
           zipObj.extractall('c:\tempp','r')
           
Hat jemand da eine Idee?
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

Importe gehören an den Anfang der Datei und nicht mitten in den Code. os wird benutzt aber nicht importiert.
Die Einrückungen sind falsch. os.chdir darf man nicht benutzen, weil es globalen Zustand verändert, und damit an anderen Stellen im Code zu unerwartetem Verhalten führen kann.
Das 1 an path1 ist unsinnig. Die Variable wird auch gar nicht verwendet, obwohl C:\tempp noch an zwei weiteren Stellen vorkommt.
Hast Du mal geschaut, was der Rückgabewert von glob.glob ist, bzw. was der Inhalt der Variable `zipps` ist?
Was macht das zweite Argument von extractall und warum übergibst Du da 'r'?
imonbln
User
Beiträge: 149
Registriert: Freitag 3. Dezember 2021, 17:07

Deine Aufgabe klingt sehr nach Hausaufgabe. Auch, wenn die Formulierung hoffentlich so nicht von deinem Lehrer stammt.

Grundsätzlich lässt sich die Aufgabe auf unterschiedliche Arten lösen, eine könnte Rekursion sein. Eine komplette Lösung möchte ich dir nicht geben, denn es klingt nach Hausaufgabe und der Weg zur Lösung ist ein wichtiger Lehrbestandteil, denn ich dir nicht vorenthalten will.

Hier ein paar Anmerkungen zu deinem Code.
  • imports gehören an den Anfang der Datei.
  • Die Startnummer kann durch die buildin Funktion enumerate erzeugt werden.
  • Die Funktion zipfile.ZipFile erwartet ein Filename und keine Liste von Filmnamen, da fehlt irgendwo eine Schleife.
  • Funktionen zum Löschen einer Datei findest du in os und shutil module. Ich empfehle etwas aus os
  • vermutlich wirst du das c:\tempp Verzeichnis so lange durchsuchen müssen, bis da keine Zip Dateien mehr drin sind.
  • Es kann von Vorteil sein die Funktionalität Verzeichnis durchsuchen, Zip Entpacken, Datei Löschen in eine Funktion zu packen.
  • os.chdir('c:\tempp') ist schlechter Still, besser wäre es, mit absoluten Pfaden zu arbeiten (aber das übersteigt vielleicht noch dein Niveau).
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sirdistschonweg: Vieles funktioniert nicht ist eine sehr schwammige Fehlerbeschreibung. Es wäre praktischer zum Antworten wenn Du da genauer werden würdest. Ist der `SyntaxError` wegen der kaputten Einrückung? Oder das es kein kein Verzeichnis "c:\tempp" gibt und `os.chdir()` deswegen einen `FileNotFoundError` auslöst, oder…

Prellt bei Deiner Tastatur das "p"? Wegen tempp und `zipps`. Würde man beides nur mit einem P schreiben. Oder hast Du extra ein C:\TEMPP Verzeichnis angelegt das jetzt neben dem C:\TEMP vom Betriebssystem existiert?

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Der Namenszusatz `obj` macht in Python keinen Sinn weil der nichts aussagt. *Alles* was man an einen Namen binden kann, ist ein Objekt in Python. Also kann/müsste man auch an jeden Namen `_obj` dran hängen. Es hat nur keinerlei Informationsgehalt für den Leser. Das `zipObj` beziehungsweise `zip_obj` sollte eher `zip_file` heissen. `zip` wäre ungünstig, weil man damit dann die gleichnamige eingebaute Funktion verdecken würde.

Statt `os` und `glob` würde man in neuem Code auch eher das `pathlib`-Modul und `Path`-Objekte verwenden.

Das würde dann also eher so aussehen (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
from pathlib import Path
from zipfile import ZipFile

TEMP_PATH = Path(R"C:\tempp")


def main():
    for start_number in range(0, 2022):
        print(start_number)
        zip_file_paths = TEMP_PATH.glob("*.zip")
        print(zip_file_paths)
        with ZipFile(zip_file_paths) as zip_file:
            zip_file.extractall(TEMP_PATH)


if __name__ == "__main__":
    main()
Die Schleife habe ich mal geraten. Die muss vielleicht anders aussehen.

Es gibt da ein potentielles Problem beim entpacken einer ZIP-Datei in das Verzeichnis in dem die ZIP-Datei liegt: Die könnte eine Datei enthalten die genau so heisst wie sie selbst!

Falls das eine Hausaufgabe ist: es gibt in jüngerer Vergangenheit mindestens zwei sehr ähnliche Fragen hier im Forum. Da wurde aber nicht direkt auf Platte entpackt und dann nach etwas gesucht, sondern *im* ZIP nach weiteren ZIP-Dateien gesucht, und die im Speicher entpackt. Stichwort `io.BytesIO`. Das würde beispielsweise das Problem mit dem gleichen Namen im ZIP umgehen.

Wobei ein eigenes temporäres Verzeichnis auch Sinn machen würde, denn C:\TEMP wird ja auch von anderen Programmen verwendet, die auch ZIP-Dateien dort ablegen könnten. Das Verzeichnis würde man aber *im* TEMP-Verzeichnis anlegen und nicht auf Laufwerk C: auf oberster Ebene. Da hätte man eventuell noch nicht mal Rechte das zu tun, wenn der Prozess als einfacher Benutzer läuft. Und auch C:\TEMP hart kodieren kann problematisch sein, weil man das umkonfigurieren kann. Und es ist dann natürlich auch noch vom Betriebssystem abhängig.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@__blackjack__,

print(zip_file_paths) ???

Ich nehme mal an die range-loop ist dazu da die Anforderung "und alles wieder von vorne" umzusetzen?
Sirius3
User
Beiträge: 17710
Registriert: Sonntag 21. Oktober 2012, 17:20

@rogerb: das ist die wörtliche Übersetzung des Kommentars `# create a loop the extract *.zip file while startnumber <= 2021:`
Benutzeravatar
__blackjack__
User
Beiträge: 13003
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@rogerb: Was `zip_file_paths` für ein Typ ist war mir schon klar, aber ich wollte das den Fragesteller lieber selbst herausfinden lassen, statt Code zu schreiben, der an der Stelle dann immer unverstanden übernommen wird.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten