Programm das Datei komprimiert

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
Santi95
User
Beiträge: 10
Registriert: Donnerstag 29. März 2012, 16:14

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
Zuletzt geändert von Hyperion am Dienstag 3. April 2012, 16:46, insgesamt 1-mal geändert.
Grund: Code in Python-Code Tags gepackt
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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:

Code: Alles auswählen

if ziel_verzeichnis:
    usw.
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`.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Santi95
User
Beiträge: 10
Registriert: Donnerstag 29. März 2012, 16:14

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
Santi95
User
Beiträge: 10
Registriert: Donnerstag 29. März 2012, 16:14

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Santi95
User
Beiträge: 10
Registriert: Donnerstag 29. März 2012, 16:14

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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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))
Santi95
User
Beiträge: 10
Registriert: Donnerstag 29. März 2012, 16:14

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

Code: Alles auswählen

print ("Verzeichnis", ordner, "erfolgreich angelegt")
Allerdings wenn ich schaue ist kein ordner angelegt.

Woran könnte liegen?
Gruß!

EDIT:
die ordner werden doch angelergt!!
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

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.
the more they change the more they stay the same
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Code: Alles auswählen

ziel = ordner + os.sep + name + ".zip"
Dafür gibt es eigentlich `os.path.join`:

Code: Alles auswählen

os.path.join(ordner, name+'.zip')
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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten