zipfile Benutzung

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
connan
User
Beiträge: 7
Registriert: Samstag 20. März 2010, 16:27

Hi,

Ich versuche gerade mir mit dem Buch "A Byte of Python" mir aus Neugierde Python beizubringen. Ich hab leider bis jetzt keine Erfahrung mit Programmiersprachen, deswegen sind meine Probleme hier wohl für die meisten recht lächerlich.
Jedenfalls soll man als Übung ein Script schreiben, das ein Backup von einem Verzeichnis erstellt. Dazu soll man ein bestehendes Script so umbauen, dass das zipfile Modul verwendet wird.
Allerdings hilft mir in dem Fall die Dokumentation (http://docs.python.org/dev/3.0/library/zipfile.html) nicht wirklich weiter, vielleicht liegts an dem Informatiker-Englisch, vielleicht weil Beispiele fehlen, keine Ahnung.
Jedenfalls hab ich danach Google bemüht und herausgefunde, dass das anscheinend so geht:

Code: Alles auswählen

file = zipfile.ZipFile(today, 'w')
for files in source:
    file.write(files)
file.close()
Allerdings wirft mir jetzt die Konsole das hier an den Kopf:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\connan\Desktop\python\backup.py", line 50, in <module>
    file = zipfile.ZipFile(today, 'w')
  File "C:\Python31\lib\zipfile.py", line 690, in __init__
    self.fp = io.open(file, modeDict[mode])
IOError: [Errno 2] No such file or directory: 'C:\\\\March 2010\\'
Hört sich irgendwie so an als ob die zip Datei schon existieren müsste, aber ich weiß nicht, wie ich eine erstellen kann. Vielleicht lieg ich aber auch nur komplett daneben und mach was anderes falsch :D

Deswegen hier mal der Link zu dem ganzen Script:
http://pastebin.com/FHq4Ba45

Bin auch über alle anderen Verbesserungsvorschläge froh, weil ich wahrscheinlich jede Menge Sachen falsch gemacht habe. Aber möglichst so dass ich das auch versteh :)

Und dann noch was kleineres. Ich steh hier anscheinend gerade brutal auf dem Schlauch, jedenfalls bekomme ich es nicht hin ein "or" richtig in einem "if" zu verwenden. Also so mein ich das:

Code: Alles auswählen

text = input('Say something: ') 
if text != 'Hi' or 'Hiho':
    print('You didn\'t say Hi or Hiho :(')

#text = input('Say something: ') 
#if text != 'Hi' or != 'Hiho':
#   print('You didn\'t say Hi or Hiho :(')

text = input('Say something: ') 
if text != 'Hi' or text != 'Hiho':
    print('You didn\'t say Hi or Hiho :(')

#text = input('Say something: ') 
#if text != 'Hi' or if text != 'Hiho':
#    print('You didn\'t say Hi or Hiho :(')

text = input('Say something: ')
if text != 'Hi':
    if text != 'Hiho':
        print('You didn\'t say Hi or Hiho :(')
Die ersten 4 Sachen sind meine Versuche das "or" irgendwie einzubauen, allerdings funktionieren alle 4 nicht, die 2 auskommentierten verursachen dazu noch Syntax-Fehler. Das letzte ist mein Workaround, funktioniert zwar, aber da könnte man ja noch eine Zeile sparen.

Wäre sehr nett wenn mir jemand zeigen könnte wie das richtig heißen muss.

Bye
(hoffentlich hab ich jetzt nich direkt im ersten Post was größeres versaut :D)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

connan hat geschrieben:Ich steh hier anscheinend gerade brutal auf dem Schlauch, jedenfalls bekomme ich es nicht hin ein "or" richtig in einem "if" zu verwenden. Also so mein ich das:

Code: Alles auswählen

text = input('Say something: ') 
if text != 'Hi' or text != 'Hiho':
    print('You didn\'t say Hi or Hiho :(')
Hier bist du jetzt über boolesche Algebra gefallen. Die Bedingung trifft zu, wenn der Text nicht 'Hi' ist oder wenn der Text nicht 'Hiho' ist. Das gilt allerdings bei deiner Formulierung immer. Wenn der Text keins der beiden Worte ist trifft die Gesamtbedingung ja offensichtlich zu. Wenn der Text aber nun 'Hi' ist, dann trifft die zweite Bedingung zu (Text nicht gleich 'Hiho') und damit dann auch die gesamte Oder-Verknüpfung. Für 'Hiho' läuft es analog. Hier könntest du entweder ein 'and' statt ein 'or' verwenden oder einen noch schöneren Ansatz wählen.

Der alternative Ansatz verwendet eine Liste um die zu suchenden Wörter zu verwalten. Das sähe dann so aus:

Code: Alles auswählen

txt = input('Say something: ') 
if not txt in ['Hi', 'Hiho']:
    print('You didn\'t say Hi or Hiho :(')
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

connan hat geschrieben:Und dann noch was kleineres.[...]
Hey,

guck dir noch mal die Logikoperatoren an ... ich denke nicht dass du 'or' verwenden willst...

Edit: to late...
connan
User
Beiträge: 7
Registriert: Samstag 20. März 2010, 16:27

Achso, danke dafür schonmal, mit "and" gehts.
Hab da wohl was durcheinandergebracht :wink:

Und auf das mit dem text durchsuchen bin ich nichtmal gekommen...
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

connan hat geschrieben:Und auf das mit dem text durchsuchen bin ich nichtmal gekommen...
Deshalb schrub ich's ja. ;-)

Aber gewöhne dir gleich die richtige Terminologie an. Das war das Suchen in einer Liste, nicht das Durchsuchen von Text.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Zu deinem anderen Problem.
IMO nur ein blöder Leichtsinnsfehler, du willst "target" öffnen und nicht "today", weil "today" ein Ordner ist ;)
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
connan
User
Beiträge: 7
Registriert: Samstag 20. März 2010, 16:27

Na wunderbar, warum hab ich das jedesmal übersehen :?

Jedenfalls wird jetzt was gepackt, allerdings nur die Ordnerstruktur, keine Dateien

@/me
Werd ich versuchen mir zu merken
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

connan hat geschrieben:Jedenfalls wird jetzt was gepackt, allerdings nur die Ordnerstruktur, keine Dateien
Wenn du nur Ordner angibst, die nachher in "source" stehen, werden auch nur diese gepackt. Wenn du das rekursiv haben willst, musst du das selber implementieren. (z.B. mit os.walk)

Noch ein Hinweis: Die zip-Datei ist standardmäßig (auf jeden Fall bei Python2.6) ohne Kompression. Wenn du das willst, musst man das extra im Konstruktor angeben.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
connan
User
Beiträge: 7
Registriert: Samstag 20. März 2010, 16:27

Danke für den Tipp mit dem os.path, jetzt hab ichs :)

Musste noch:

Code: Alles auswählen

for paths in source: 
    for path, dirs, files in os.walk(paths):
        print(len(files), 'Files to backup.')
einfügen damit es geht. Ich hoffe jetzt mal dass das so in Ordnung ist, weil ich hab einige Zeit gebraucht bis ich darauf gekommen bin dass ich "source" nich direkt in os.path einfüllen kann. Wäre euch fast schon hier damit auf die Nerven gegangen :oops:

Naja, jedenfalls eine letzte Frage habe ich jetzt noch:
Wenn ich, wenn ich gefragt werde welches Verzeichnis ich sichern möchte, irgendwas in Python angeben, also zum Beispiel direkt

Code: Alles auswählen

for paths in source: 
    for path, dirs, files in os.walk(paths):
        print(len(files), 'Files to backup.')
fängt Python mir an wie wild die Konsole zuzumüllen mit der Nachricht:

Code: Alles auswählen

x Files to backup.
wobei x eine scheinbar zufällige Zahl ist.

An was liegt das? Und kann ich das irgendwie verhindern?
In vielen Beispielen wird "raw_input" verwendet und irgendwo stand auch dass bei "input" Python code ausgeführt wird und bei "raw_input nicht" (oder so ähnlich), allerdings stand als ich in der Python Dokumentation nachgeschaut habe, dass in Version 3 "raw_input" zu "input" wurde, wenn ich das richtig verstanden habe.


edit: Zu früh gerfreut, funktioniert nur wenn keine Ordner in dem Ordner sind der gespeichert werden soll. Vielleicht bekomm ichs nach ein bisschen Schlaf hin, um die Uhrzeit wird das sicher nichts mehr. Ob der Autor gedacht hat dass man damit so viele Probleme haben kann?
Zuletzt geändert von connan am Sonntag 21. März 2010, 00:08, insgesamt 1-mal geändert.
BlackJack

@connan: Du hast da eine ``for``-Schleife -- was hattest Du denn erwartet wie oft das ``print`` ausgeführt wird!? Das `x` ist nicht zufällig, sondern eben die Anzahl der Dateien in jedem (Unter)Verzeichnis.
connan
User
Beiträge: 7
Registriert: Samstag 20. März 2010, 16:27

Naja ich war eben verwirrt dass wenn ich da den Codeschnipsel reinwerf das nicht als inkorrekter Pfad erkannt wird, und da überhaupt anscheinend irgendwas ausgeführt wird.

Ich mein,

Code: Alles auswählen

print(input())
gibt mir ja auch nur das aus was ich da reinwerf und fängt nicht an komische Sachen zu machen (zumindest für mich is das sehr komisch)

Naja, ich bin anscheinend einfach komplett verwirrt jetzt :(
BlackJack

@connan: Irgendwie ergibt Dein Beitrag keinen Sinn für mich. Ein Codeschnippsel der nicht als inkorrekter Pfad erkannt wird!? Wovon redest Du bitte!?

Die Schleife macht keine komischen Sachen, sondern wird einfach nur ausgeführt. Was sollte sie sonst machen?
connan
User
Beiträge: 7
Registriert: Samstag 20. März 2010, 16:27

Hmm, vielleicht hab ich mich ein bisschen undeutlich ausgedrückt.

Sag ich es mal so:

Das Stück hab ich eingefügt damit es - wie du gesagt hast - die einzelnen Dateien in den Ordnern findet.

Mir gings aber darum, wenn ich das Script ausführe, und in dem Moment, an dem Ich den Pfad zu dem Ordner angebe, den ich sichern möchte, irgendein Stück Python eingebe, der beschriebene Effekt auftritt. Und ich weiß eben nicht warum.

Tut mir Leid wenn das nicht so rübergekommen ist.
BlackJack

@connan: Ich bin immer verwirrter. Wie und wo gibst Du während das Programm läuft "irgendein Stück Python" ein!? Benutzt Du etwa Python <3 und `input()`? Wenn Du da Python-Code eingibst, dann wird der *ausgeführt*. Deswegen sollte man das ja auch nicht nehmen, sondern `raw_input()`.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Das Erklärungsproblem ergibt sich glaube ich daraus, dass das ursprüngliche Problem nicht erkannt wurde.

connan erwartet anscheinend, dass die for-Schleife in Verbindung mit os.walk() nur einmal durchlaufen wird. os.walk() ist aber ... anders.
connan
User
Beiträge: 7
Registriert: Samstag 20. März 2010, 16:27

Ich glaube, wir reden hier irgendwie aneinader vorbei.
Also, so siehts im Moment aus:
http://pastebin.com/y1NTM3ht

Wenn ich es ausführe, gibts diese 5 Schritte:
1. Ich werde nach dem Ordner gefragt den ich sichern möchte
2. Ich werde gefragt wo ich das Backup hingespeichert haben möchte
3. Ich werde gefragt ob ich einen Kommentar geben möchte
4. Backup wird erstellt.

Jetzt hab ich im Moment - so weit ich das bis jetzt bemerkt habe - 2 Probleme:
1.Die zip Datei wird nur erstellt, wenn in dem Ordner nur Dateien, und keine anderen Ordner sind.
Liegt wohl daran dass ich, wie /me gesagt hat, die Funktionsweise von os.walk nicht so ganz verstanden habe.

2. Also, nach weiterem herumprobieren, weiß ich jetzt glaube ich was los ist, Entschuldigung für die Verwirrung, war wohl doch etwas zu spät, und ich hab nicht genug herumprobiert.
Es ist so, dass ich, wenn ich einen inkorrekten Pfad angebe, zum Beispiel "sofihopseh" oder aber auch ein Stück Python, und danach aber keinen richtigen Pfad mehr, meine ganze Festplatte durchsucht wird, was natürlich meine Konsole total verstopft und mich mitten in der Nacht ziemlich verwirrt. Naja immerhin bin ich jetzt nach ein wenig Schlaf daraufgekommen, was falsch war.

Ich glaube aber, ich werde das jetzt einfach so lassen, und mit dem Buch weitermachen. War ja ganz hilfreich, aber anscheinend lässt sich so eine Aufgabe mit meinem Wissen noch nicht vernünftig lösen.
Auf jedenfall danke nochmal für die Hilfe und Entschuldigung für die Verwirrung die ich hier verbreitet habe :wink:

PS: Wenn jemand ein leichtes Pythonscript kennt das sowas macht und ich verstehen könnte, würde ich es mir natürlich gerne ansehen, damit ich weiß wie das richtig aussehen sollte, allerdings ist es auch nicht schlimm wenn keiner sowas hat.
Antworten