ZipFile

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
VirgilAbloh
User
Beiträge: 3
Registriert: Mittwoch 26. Dezember 2018, 18:07

Guten Abend,

ich besuche eine weiterführende Schule und habe/hatte/und werde auch nie haben, Informatikunterricht oder dergleichen in dieser Schule. Aktuell mache ich mein Abitur (Ja, bald sind die Prüfungen :D ). Da ich in der Vergangenheit durch Monitore für Shopping-Seiten (um bspw. einen Restock von limitierten Schuhen mitzukriegen) auf Python aufmerksam geworden bin, habe ich entschieden, dass ich diese lernen und somit in die Welt der Programmiersprachen einsteigen möchte.

Nun aber zum eigentlichen Problem: Im Internet bin ich auf ein E-Book gestoßen, welches einen Python beibringen soll. Ich habe 73 von 120 Seiten gelesen und bin nun an dem Punkt angelangt, an dem man das erste "richtige" Programm konzipiert. Dieses dient dazu, Daten aus einem best. Verzeichnis als ZIP-Datei zu sichern.
Die Vorlage ist folgende:
#!/usr/bin/python
import os
import time
# 1. Die Dateien und Verzeichnisse, die gesichert werden sollen,
# werden in der folgenden Liste angegeben:
quellen = ['/home/swaroop/byte', '/home/swaroop/bin']
# Unter Windows muessen Sie die Pfade auf diese Weise angeben:
# quellen = ['C:\\Dokumente', 'D:\\Arbeit']
# 2. Die Sicherung muss in das folgende Hauptverzeichnis fuer
# Sicherungen gespeichert werden:
ziel_verzeichnis = '/mnt/e/sicherung/'
# Denken Sie daran, dies an Ihre Gegebenheiten anzupassen.
# 3. Die Dateien werden in einer ZIP-Datei gesichert.
# 4. Der Name der ZIP-Datei setzt sich aus dem aktuellen Datum
# und der Uhrzeit wie folgt zusammen:
ziel = ziel_verzeichnis + time.strftime('%Y%m%d%H%M%S') + '.zip'
# 5. Wir benutzen den Befehl zip (unter Unix/Linux), um die Dateien
# zu einem ZIP-Archiv zu komprimieren:
zip_befehl = 'zip -qr %s %s' % (ziel, ' '.join(quellen))
# Windows-Benutzer koennen z.B. PKZIP oder Info-ZIP in das
# Windows-Systemverzeichnis kopieren, damit dies funktioniert.
# Sicherung starten
if os.system(zip_befehl) == 0:
print 'Erfolgreiche Sicherung nach', ziel
else:
print 'Sicherung fehlgeschlagen!'
Nach einigen Recherchen im Internet bin ich auf dem Schluss gekommen, dass ich bei #5. stattdessen mit dem Befehl
zipfile.ZipFile
arbeiten muss.
Dies habe ich zunächst auch getan und bin somit auf meinen Lösungsansatz gekommen:
#!/usr/bin/python

import os
import time
import zipfile

#1. Zu sichernde Dateien und Verzeichnisse werden hier angegeben

quellen = 'C:\\Users\Abloh\Documents\Abloh\FA'

#2. Die Sicherung muss in das folgende Hauptverzeichnis fuer Sicherungen gespeichert werden
ziel_verzeichnis = 'C:\\Users\Abloh\Documents\Abloh'

# 3. Dateien werden in einer ZIP-Datei gesichert

# 4. Name der ZIP-Datei setzt sich aus dem aktuellen Datum und der Uhrzeit wie
# folgt zusammen:
ziel = ziel_verzeichnis + time.strftime('%Y%m%d%H%M%S') + '.zip'

# 5. Wir benutzen den Befehl zip (unter Unix/Linux), um die Dateien
# zu einem ZIP-Archiv zu komprimieren:
zip_befehl = zipfile.ZipFile (ziel, 'x'.join(quellen))
# Windows-Benutzer koennen z.B. PKZIP oder Info-ZIP in das
# Windows-Systemverzeichnis kopieren, damit dies funktioniert.

# Sicherung starten
if os.system(zip_befehl) == 0:
print ('Erfolgreiche Sicherung nach', ziel)
else:
print ('Sicherung fehlgeschlagen!')
Das Problem hierbei ist, dass mir dann folgende Fehlermeldung ausgegeben wird:
Traceback (most recent call last):
File "zip-programm.py", line 27, in <module>
if os.system(zip_befehl) ==0:
TypeError: system() argument 1 must be str, not ZipFile
Daraufhin habe ich es mit einem zweitem Lösungsansatz versucht:
zip_befehl = zipfile.ZipFile(ziel, 'x'.join(quellen))
Dies liefert allerdings komischerweise die Fehlermeldung:
ValueError: ZipFile requires mode 'r', 'w', 'x', or 'a'
Ich würde mich freuen, wenn hier jemand eine Lösung auf mein Problem liefern könnte. :mrgreen:

Ansonsten wünsche ich allen hier noch eine schöne Zeit und einen erholsamen Abend.

Mit besten Grüßen

VirgilAbloh
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Du musst als zweites Argument den Modus übergeben. Bisher wird durch join() nur der Pfad zusammengesetzt und bei der Initialisierung der Klasse ZipFile übergeben.

Bsp.

Code: Alles auswählen

zip_befehl = zipfile.ZipFile(ziel, 'x'.join(quellen), 'w' )
Schau' dir auch mal das with statement zum Öffnen und schließen des schreibvorganges an.

Mein wohl wichtigster Tipp an dieser Stelle, lese bitte die offizielle Dokumentation zu ZipFile. Da steht das alles, sogar schick mit Beispielen, geschrieben.
When we say computer, we mean the electronic computer.
VirgilAbloh
User
Beiträge: 3
Registriert: Mittwoch 26. Dezember 2018, 18:07

Hallo nochmal,

Danke für die schnelle Antwort! Ich probier das mal nachher aus, aber ich wollte mich schon mal für deinen Lösungsvorschlag bedanken.

Mit besten Grüßen

VirgilAbloh
VirgilAbloh
User
Beiträge: 3
Registriert: Mittwoch 26. Dezember 2018, 18:07

Hallo, ich bins wieder :mrgreen:

Ich habe mal versucht das Gesagte umzusetzen und habe auch versucht, das with statement einzubauen. Allerdings bin ich aus der Dokumentation auch nicht schlau geworden, denn hier steht folgendes:
with ZipFile('spam.zip') as myzip:
with myzip.open('eggs.txt') as myfile:
print(myfile.read())
Ich habe versucht das irgendwie nach Gefühl zu übernehmen und das Skript sieht dann wie folgt aus:
#!/usr/bin/python

import os
import time
import zipfile

#1. Zu sichernde Dateien und Verzeichnisse werden hier angegeben

quellen = r'C:\Users\Abloh\Documents\Abloh\FA'

#2. Die Sicherung muss in das folgende Hauptverzeichnis fuer Sicherungen gespeichert werden
ziel_verzeichnis = r'C:\Users\Abloh\Documents\Abloh'

# 3. Dateien werden in einer ZIP-Datei gesichert

# 4. Name der ZIP-Datei setzt sich aus dem aktuellen Datum und der Uhrzeit wie
# folgt zusammen:
ziel = ziel_verzeichnis + time.strftime('%Y%m%d%H%M%S') + '.zip'

# 5. Wir benutzen den Befehl zip (unter Unix/Linux), um die Dateien
# zu einem ZIP-Archiv zu komprimieren:
from shutil import make_archive
with zipfile.ZipFile('quellen', 'w') as ziel:
zipfile.write('ziel')
zip_befehl = zipfile.ZipFile(('ziel, ' '.join(quellen)'),'w')
# Windows-Benutzer koennen z.B. PKZIP oder Info-ZIP in das
# Windows-Systemverzeichnis kopieren, damit dies funktioniert.

# Sicherung starten
if os.system(zip_befehl) == 0:
print ('Erfolgreiche Sicherung nach', ziel)
else:
print ('Sicherung fehlgeschlagen!')
Hier bekomme ich allerdings die Fehlermeldung:
AttributeError: module 'zipfile' has no attribute 'write'
Wenn ich dieses with statement nicht verwende sieht es dann wie folgt aus:
#!/usr/bin/python

import os
import time
import zipfile

#1. Zu sichernde Dateien und Verzeichnisse werden hier angegeben

quellen = r'C:\Users\Abloh\Documents\Abloh\FA'

#2. Die Sicherung muss in das folgende Hauptverzeichnis fuer Sicherungen gespeichert werden
ziel_verzeichnis = r'C:\Users\Abloh\Documents\Abloh'

# 3. Dateien werden in einer ZIP-Datei gesichert

# 4. Name der ZIP-Datei setzt sich aus dem aktuellen Datum und der Uhrzeit wie
# folgt zusammen:
ziel = ziel_verzeichnis + time.strftime('%Y%m%d%H%M%S') + '.zip'

# 5. Wir benutzen den Befehl zip (unter Unix/Linux), um die Dateien
# zu einem ZIP-Archiv zu komprimieren:
zip_befehl = zipfile.ZipFile(('ziel, ' '.join(quellen)'),'w')
# Windows-Benutzer koennen z.B. PKZIP oder Info-ZIP in das
# Windows-Systemverzeichnis kopieren, damit dies funktioniert.

# Sicherung starten
if os.system(zip_befehl) == 0:
print ('Erfolgreiche Sicherung nach', ziel)
else:
print ('Sicherung fehlgeschlagen!')
Die Fehlermeldung dazu wäre dann:
File "zip-programm.py", line 27, in <module>
if os.system(zip-befehl) == 0:
Type Error: system() argument 1 must be str, not ZipFile
Ich wäre sehr dankbar, wenn mir hier weitergeholfen werden kann :D

Mit besten Grüßen

VirgilAbloh
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Frage ist, willst Du Python zum Erzeugen eines Zip-Files benutzen, oder ein externes Programm? Das externe Programm ist eigentlich unnötig, da man das mit Python-Boardmitteln genauso kann.

Ich weiß nicht, mit welchem Buch Du da lernst, aber Dateien setzt man mit os.path.join zusammen, denn so wie es jetzt geschrieben ist, landet nichts im Zielverzeichnis.
Zu raten, wie man mit Klammern und Anführungszeichen irgendwas mit ZipFile macht, ist nicht programmieren, da liest man in der Dokumentation nach, wie der Aufruf von ZIpFile auszusehen hat, da muß man dann mit write Dateien einzeln ins zip-File schreiben, die man z.B. per Path.glob sucht.

Alternativ kannst Du wirklich einen externen Befehl zusammensetzen, dann aber mit subprocess.check_call und einer Liste als Argumente.
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ergänzend: Ab Python 3.5 wird `subprocess.run()` bevorzugt. Mit ``check=True`` wenn `check_call()` damit ersetzt werden soll.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten