der archiver

Code-Stücke können hier veröffentlicht werden.
Antworten
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Code: Alles auswählen

#!/usr/bin/env python
import tarfile, os
file = tarfile.open(os.path.expanduser(os.path.join("~","meinedateien.tar.gz")), "w:gz")
file2 = open(os.path.expanduser(os.path.join("~","error_arch.log","a")))
wurzel = os.path.expanduser(os.path.join("~","!!!!meine_dateien!!!!"))
def make(wurzel):
    for root, dirs, files in os.walk(wurzel):
        for _name in files:
            try:
                file.add(os.path.join(wurzel,_name))
            except TarError:
                file2.write("an error has accured while writing: %s %s %s\n" % (ro ot,dirs,files))
        for _name in dirs:
            wurzel = os.path.join(root,_name)
            make(wurzel)
make(wurzel)
file2.close()
file.close()
ich finds praktisch, nur der ordner muss neu benannt werden, je nach bedarf ;)
Zuletzt geändert von murph am Freitag 30. Juni 2006, 15:44, insgesamt 2-mal geändert.
BlackJack

Das Programm enthält einen Fehler. Wenn jemals ein Problem beim hinzufügen zum Archiv auftaucht dann wird versucht `i` zu erhöhen, nur das es das `i` in der Funktion gar nicht gibt. Das führt zu einer `UnboundLocalError` Ausnahme.

Verschieb ``i = 0`` in die Funktion und gib den Wert am Ende als Rückgabewert zurück.

Und das abfangen von allen Ausnahmen mit `except` ist keine gute Idee. Damit fängst Du zum Beispiel auch Versuche vom Benutzer ab, das Programm mit ``Strg+C`` abzubrechen. Oder `NameError` Ausnahmen wenn Du einen Tippfehler gemacht hast usw.

Und noch eine Frage: Warum ist vor `name` ein Unterstrich?
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

sry, i müsste global sein, stimmt ***dämlicherfehler***
und except, da war ich so in meinem system vertieft, dass ich vergessen habe, dass es wen stören könnte. bei jedem systemkill wird das ausgeführt und ich weiß sowieso nie, wann das ist. bei anderen system kann das anders sein, werde änderungen machen.
zu "_name":
das kommt daher, weil mein texteditor mir das einfärbt und mich damit irritiert.(^^)
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

so, hab die version mir angepasst (beim ausführen ist man root, daher andere pfade) und habe festgestellt, dass zwar alles sehr gut läuft, ich aber notorisch fehlermeldungen bekomme, dass nichts geklappt hätte!
habe das archiv entpackt, kein problem!
hat jemand eine erklärung?
(ich habe das mit i verändert)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

murph hat geschrieben:hat jemand eine erklärung?
Hi murph!

Du sicherst immer absolute Pfade. Sobald du relative Pfade sichern willst, funktioniert dein Beispiel nicht mehr.

Sieh dir doch vielleicht noch einmal dieses Beispiel an:
http://www.python-forum.de/post-37948.html#37948

Es gibt zwar in meinem Beispiel auch noch Fehler, aber die versuche ich jetzt raus zu finden.

Achte besonders darauf, dass in diesem Beispiel die Daten nicht mit add() sondern mit addfile() ins TAR-Archiv hinzugefügt werden.

Außerdem überschreibst du "file". Das sollte man sich nicht angewöhnen. Statt "_name" empfehle ich "filename".

lg
Gerold
:-)

Edit by Gerold: Ich musste einen Satz umformulieren ;-)
Zuletzt geändert von gerold am Freitag 30. Juni 2006, 16:59, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi murph!

Ich habe jetzt den Fehler im Beispielcode des Beitrages http://www.python-forum.de/post-37948.html#37948 gefunden.

Die Quelldatei muss unbedingt **binär** geöffnet werden, sonst regnet es Fehler. Unter Windows zumindest :-)

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

murph hat geschrieben:hat jemand eine erklärung?
Hi murph!

Du hattest eine Schleife zu viel drinnen. Ins Archiv wurden zu viele Dateien archiviert. Ich habe mir ein Archiv, das ich mit deinem Skript erstellt habe, mit WinRAR angesehen. Da sind mir viel zu viele Dateien entgegengesprungen.

Ich habe das Skript so weit ausgebessert, dass es funktionieren sollte. Allerdings habe ich mir nicht die Mühe gemacht, die bereits oben von mir bemängelten Dinge auszubessern.

Code: Alles auswählen

#!/usr/bin/env python
import tarfile, os
file = tarfile.open(os.path.expanduser(os.path.join("~","meinedateien.tar.gz")), "w:gz")
file2 = open(os.path.expanduser(os.path.join("~","error_arch.log","a")))
wurzel = os.path.expanduser(os.path.join("~","!!!!meine_dateien!!!!"))
def make(wurzel):
    for root, dirs, files in os.walk(wurzel):
        for _name in files:
            try:
                file.add(os.path.join(root,_name)) # von Wurzel nach root geändert
            except TarError, data:
                print data
                file2.write("an error has accured while writing: %s %s %s\n" % (root,dirs,files))
        #for _name in dirs:
        #    wurzel = os.path.join(root,_name)
        #    make(wurzel)
make(wurzel)
file2.close()
file.close()
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

das ist das problem gewesen xX.
naja, es hatte geklappt, mir war das vorher nicht aufgefallen, dass da zu viel drin war, außerdem ist man nicht kritisch, wenn alles funktioniert...
(bis man den fehlerlog ließt ;) )
aber wieso ist das denn nicht binär? das sollte doch aufgabe von tarfile sein !?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi!

Ich habe mich noch einmal damit befasst und die wahrscheinlich einfachste Möglichkeit gefunden, einen Ordner inklusive aller seiner Unterordner in ein komprimiertes Tar-Archiv zu kopieren. -- Alles schon eingebaut. 8)

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import os.path
import tarfile

def to_tar_gz(source, destination):
    """
    Archiviert eine Datei oder einen Ordner in ein mit GZip komprimiertes
    TAR-Archiv. (auch inklusive Unterordner)
    
    :param source: Dateiname oder Ordnername. Wird ein Dateiname angegeben, 
        dann wird nur dieser Dateiname archiviert. Wird ein Ordnername angegeben,
        dann wird der komplette Ordner inklusive aller Unterordner archiviert.
    :param destination: Dateiname des Ziels. (TAR-GZ-Archiv *.tar.gz)
    """
    
    t = tarfile.open(name = destination, mode = 'w:gz')
    t.add(source, os.path.basename(source))
    t.close()
    
    return True
Wie man sieht, wird an ``t.add()`` als zweites Argument der Basename der Quelle übergeben. Dadurch wird das Tar-Archiv "relativ". Die Pfade sind dann nicht mehr "absolut" angegeben. Das Entpacken in einen anderen Ordner wird dadurch erleichtert.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

das sieht irgendwie einfacher aus.
THX!
http://www.cs.unm.edu/~dlchao/flake/doom/
Antworten