Seite 1 von 1
Programm das Datei komprimiert
Verfasst: Dienstag 3. April 2012, 16:38
von Santi95
Hallo zusammen:
ich habe/wollte ein Programm schreiben das Dateien komprimiert.
(Habe dazu einen Teil aus "a byte of python" verwendet und verändert)
Ich bekomme nur immer einen Syntag Error wenn ich es laufen lasse
und zwar gleich am anfang:
Sieht jemand den Fehler oder geht das einfach mit input nicht?
Script:
Code: Alles auswählen
import os
import time
# 1.Dateien und Verzeichnisse die gesichert/gepackt werden sollen
quelle = input("Welcher Ordner soll gepackt werden (/../../..)? ")
# 2.Ergebniss soll in einem Hauptverzeichnis für Sicherungen gespeicher werden
ziel_verzeichniss = input("Wohin soll es gepackt werden (/../../..)\n (bei keiner eingabe ",quelle)
if len(ziel_verzeichniss) == 0:
ziel_verzeichniss = quelle
# 3.Komprimierung
# 4."ordner" ist der Name des Unterverzeichnisses:
order = raw_input("Wie soll der ordner heißen wo das File gespeicher wird? ")
# Die aktuelle Uhrzeit ist der Name des ZIP-Archivs:
name = raw_input("Wie soll das file heißen? ")
# Unterverzeichnis wenn es noch nicht da ist, erstellen
if not os.path.exists(ordner):
os.mkdir(ordner)
print ("Verzeichnis", ordner, "erfolgreich angelegt")
# Pfad der Datei
ziel = ordner + os.sep + name + ".zip"
#5.Zip Befehl
zip_befehl = "zip -qr %s %s" % (ziel, " ".join(quellen))
if os.system(zip_befehl) == 0:
print "Erfolgreiche Übertragung nach ", ziel
else:
print "Sicherung fehlgeschlagen"
Fehler:
Code: Alles auswählen
Welcher Ordner soll gepackt werden (/../../..)? /home/jakob/workspace
Traceback (most recent call last):
File "/home/jakob/workspace/komprimierung.py", line 6, in <module>
quelle = input("Welcher Ordner soll gepackt werden (/../../..)? ")
File "<string>", line 1
/usr
^
SyntaxError: invalid syntax
Re: Programm das Datei komprimiert
Verfasst: Dienstag 3. April 2012, 16:56
von Hyperion
Du solltest Python-Code immer in den entsprechenden Tags posten: [ code=python ] (ohne die Leerzeichen).
Du mischst `input` und `raw_input`, daher gehe ich davon aus, dass Du Python 2.x nutzt, richtig? Das `input` ist denn auch schon des Rätsels Lösung. Du willst `raw_input` verwenden; `input` *interpretiert* Benutzereingaben wie Python-Code. "/usr" ist eben kein gültiger Python-Code
Noch ein paar Anmerkungen zu Deinem Code:
Code: Alles auswählen
if len(ziel_verzeichniss) == 0:
ziel_verzeichniss = quelle
Das ist ziemlich umständlich; anstatt auf Länge = 0 zu prüfen, überprüfe doch einfach anhand des Wahrheitswertes:
Du kannst Dir das `if` aber auch sparen und mittels `or` einen default Wert angeben, in Deinem Falle also `quelle`:
Code: Alles auswählen
In [17]: bar = raw_input("foo") or "default"
foo
In [18]: bar
Out[18]: 'default'
Strings im Allgemeinen und Dateien im speziellen baut man nicht mittels `+` zusammen. Für Pfade gibt es `os.path.join`, für "normale" Strings nutze `"".join` oder `"".format()`.
Statt `os.system` benutze lieber `subprocess`.
Re: Programm das Datei komprimiert
Verfasst: Dienstag 3. April 2012, 19:21
von Santi95
hab nur das "input" in "raw_input" geändert.
Nun bekomme ich allerdings die fehlermeldung:
Code: Alles auswählen
Welcher Ordner soll gepackt werden (/../../..)? /home/jakob/workspace
Traceback (most recent call last):
File "/home/jakob/workspace/komprimierung.py", line 9, in <module>
ziel_verzeichniss = raw_input("Wohin soll es gepackt werden (/../../..)\n (bei keiner eingabe ",quelle)
TypeError: [raw_]input expected at most 1 arguments, got 2
worin liegt dann eig der genaue unterschied zwischen input und raw_input?
wieso gehst du davon aus das ich wenn ich die "inputs" mische dass ich dann 2. habe(hab 2.7.2+)?
Ist bei python 3 dann beides zusammen?
Gruß und danke für deine Tipps
Re: Programm das Datei komprimiert
Verfasst: Dienstag 3. April 2012, 19:26
von Santi95
Hyperion hat geschrieben:
Strings im Allgemeinen und Dateien im speziellen baut man nicht mittels `+` zusammen. Für Pfade gibt es `os.path.join`, für "normale" Strings nutze `"".join` oder `"".format()`.
Statt `os.system` benutze lieber `subprocess`.
Verstehe nicht so ganz was du meinst...könntest du mir ein beispiel vllt anhand meines codes liefern.
Re: Programm das Datei komprimiert
Verfasst: Dienstag 3. April 2012, 20:21
von Hyperion
Die Signatur von `raw_input` erlaubt nun einmal nur einen Parameter vom Typ String. Du übergibst aber ja noch einen zweiten - wozu das?
Der Unterschied besteht darin, dass `raw_input` Eingaben als String interpretiert (also auch Zahlen!) und nicht "auswertet", wie `input` das tut.
Bei Python3 wird aus `raw_input` einfach `input` und das "alte" `input` fällt weg (afaik). Da Du beides verwendetest kann man leicht darauf schließen, dass Du Python 2.x verwendest

Wie Du siehst spielt die Version hier eine wichtige Rolle bei der Interpretation Deines Fehlers.
@Anmerkungen bzw. Nachfragen:
Code: Alles auswählen
In [80]: ", ".join(["Hallo", "Welt"])
Out[80]: 'Hallo, Welt'
In [82]: import os.path
In [83]: os.path.join("foo", "bar", "file.txt")
Out[83]: 'foo/bar/file.txt'
Das `subprocess`-Modul musst Du Dir selber mal angucken und im Netz dazu notfalls nach Beispielen suchen. Hier im Board sollte es dazu auch genügend Material geben

Re: Programm das Datei komprimiert
Verfasst: Dienstag 3. April 2012, 20:31
von Santi95
Hyperion hat geschrieben:Du übergibst aber ja noch einen zweiten - wozu das?
wie ich überge noch einen zweiten?
ich geb doch nur mein verzeichniss ein
also:
/home/jakob/workspace
oder liegt der fehler woanders?
Re: Programm das Datei komprimiert
Verfasst: Dienstag 3. April 2012, 21:28
von cofi
Ich sehe hier 2:
Code: Alles auswählen
ziel_verzeichniss = raw_input("Wohin soll es gepackt werden (/../../..)\n (bei keiner eingabe ",quelle)
Auch wenn `raw_input` sein Argument "printed" heisst es nicht, dass es sich so verhaelt.
Du suchst:
Code: Alles auswählen
ziel_verzeichniss = raw_input("Wohin soll es gepackt werden (/../../..)\n (bei keiner eingabe {0}".format(quelle))
Re: Programm das Datei komprimiert
Verfasst: Dienstag 3. April 2012, 22:11
von Santi95
Danke dass hatt sich schonmal erledigt!
Allerdings hängt er sich nach dem erstellen des Ordners auf.
Brauche ich zuerst die root rechte für sowas oder wie funktioniert das?
Das letzte was ausgeben wird ist die
Allerdings wenn ich schaue ist kein ordner angelegt.
Woran könnte liegen?
Gruß!
EDIT:
die ordner werden doch angelergt!!
Re: Programm das Datei komprimiert
Verfasst: Dienstag 3. April 2012, 22:56
von Dav1d
Du benötigst übrigens keine Klammern bei `print` und Python 2.
In Python 3 ist print eine Funktion geworden, deshalb benötigst du mit Python 3 auch die Klammern.
Re: Programm das Datei komprimiert
Verfasst: Mittwoch 4. April 2012, 12:04
von nomnom
Dafür gibt es eigentlich `os.path.join`:
Gut, so viel bringt’s ja auch nicht.
Code: Alles auswählen
zip_befehl = "zip -qr %s %s" % (ziel, " ".join(quellen))
Und dafür gibt es das `zipfile`-Modul. Vielleicht möchtest du dir das ja auch mal anschauen, eventuell nachdem du das Programm fertig hast.
Re: Programm das Datei komprimiert
Verfasst: Mittwoch 4. April 2012, 12:17
von Hyperion
Ich habe den Thread mal hier ins "Allgemeine Fragen"-Forum verschoben. Imho ist das weniger Präsentation als vielmehr ein Thema fürs Fragen.
@Santi95: Sobald es "fertig" ist würde ich dann auch das "Snippet"-Forum vorschlagen, wo Du Dein Script posten kannst
