tar erstellen per Python 3.0
Hi,
ich habe anfang der Woche damit begonnen mir Python beizubringen, was sich als etwas kompliziert heraustellte da ich mit python3.0 arbeiten möchte/sollte die ganzen tutorials jedoch python 2.6 erklären.
Nach und nach hat es aber dann doch geklappt.
Nun zu meiner Frage:
Ich möchte nun eine Archivirung mit Python 3.0 in das .tar format vornehmen (am besten mit 7-zip, bin aber auch offen für andere möglichkeiten). Leider habe ich meine Probleme eine Schnittstelle zwischen einem Python skript und 7-zip herzustellen.
Um schonmal fragen oder unverständis zu beseitigen:
NEIN, dies ist KEIN schülerprojekt, hausaufgabe etc. es handelt sich um ein Projekt einer Firma in der ich zurzeit Praktikum mache um installationen zu automatiesieren, jedoch hat sich hier leider noch niemand mit Python befasst.
und JA, ich weiss das dies auch SEHR leicht mit einer 2 zeiligen Batch-datei möglich wäre (die ich auch schon geschrieben habe und die einwandfrei funktioniert).
Danke schonmal
P.S.: ich arbeite hier mit Windows (weiss nicht genau wie groß da der unterschied ist)
P.P.S.: Ich hoffe hier nicht auf ein Fertiges skript oder ähnliches da ich VERSTEHEN will wie das gane aussieht und es nicht fertig herauskopieren möche (erklären bitte gut verständlich, arbeite wie gesagt seit anfang der woche mit Python und weitere Programier erfahrungen halten sich dezent in grenzen.)
ich habe anfang der Woche damit begonnen mir Python beizubringen, was sich als etwas kompliziert heraustellte da ich mit python3.0 arbeiten möchte/sollte die ganzen tutorials jedoch python 2.6 erklären.
Nach und nach hat es aber dann doch geklappt.
Nun zu meiner Frage:
Ich möchte nun eine Archivirung mit Python 3.0 in das .tar format vornehmen (am besten mit 7-zip, bin aber auch offen für andere möglichkeiten). Leider habe ich meine Probleme eine Schnittstelle zwischen einem Python skript und 7-zip herzustellen.
Um schonmal fragen oder unverständis zu beseitigen:
NEIN, dies ist KEIN schülerprojekt, hausaufgabe etc. es handelt sich um ein Projekt einer Firma in der ich zurzeit Praktikum mache um installationen zu automatiesieren, jedoch hat sich hier leider noch niemand mit Python befasst.
und JA, ich weiss das dies auch SEHR leicht mit einer 2 zeiligen Batch-datei möglich wäre (die ich auch schon geschrieben habe und die einwandfrei funktioniert).
Danke schonmal
P.S.: ich arbeite hier mit Windows (weiss nicht genau wie groß da der unterschied ist)
P.P.S.: Ich hoffe hier nicht auf ein Fertiges skript oder ähnliches da ich VERSTEHEN will wie das gane aussieht und es nicht fertig herauskopieren möche (erklären bitte gut verständlich, arbeite wie gesagt seit anfang der woche mit Python und weitere Programier erfahrungen halten sich dezent in grenzen.)
Zuletzt geändert von Civili4n am Freitag 3. April 2009, 08:43, insgesamt 1-mal geändert.
hm, ja ehrlich gesagt nichts
mir wurde nur gesagt das ich 7-zip benutzen kann und bin dementsprechend davon ausgegangen das es nur so geht
ich hatte wirklich unterschätzt was python doch so draufhat o.O
Danke! .. war ne schnelle, kurze und absolut präziese hilfe. ^^
jetz hoff ich nur das ich das zum laufen kriege
mir wurde nur gesagt das ich 7-zip benutzen kann und bin dementsprechend davon ausgegangen das es nur so geht
ich hatte wirklich unterschätzt was python doch so draufhat o.O
Danke! .. war ne schnelle, kurze und absolut präziese hilfe. ^^
jetz hoff ich nur das ich das zum laufen kriege
Also grundsätzlich läuft es jetzt und siehst so aus:
funtioniert auch ...
aber, der Ordner "Quellenverzeichnisse" hat 4 Unterordner die JEWEILS eine .tar datei werden sollen und den namen den sie vorher hatten auch behalten sollen.
Da die ordnernamen sich ändern und is keine lust habe jedesmal das skript umzuschreiben sollte es doch irgendwie möglich sein die namen zu importieren.
ein versuch der wiefolg aussieht funtioniert leider nicht:
Code: Alles auswählen
import tarfile
tar = tarfile.open("C:\\Temp\\Quellverzeichnisse.tar", "w")
for name in ["C:\\Quellverzeichnisse"]:
tar.add(name)
tar.close()
aber, der Ordner "Quellenverzeichnisse" hat 4 Unterordner die JEWEILS eine .tar datei werden sollen und den namen den sie vorher hatten auch behalten sollen.
Da die ordnernamen sich ändern und is keine lust habe jedesmal das skript umzuschreiben sollte es doch irgendwie möglich sein die namen zu importieren.
ein versuch der wiefolg aussieht funtioniert leider nicht:
Code: Alles auswählen
import tarfile
for name in ["C:\\Quellverzeichnisse"]:
tar = tarfile.open("C:\\temp" + name + ".tar", "w")
tar.add(name)
tar.close()
Zuletzt geändert von Civili4n am Freitag 3. April 2009, 09:58, insgesamt 1-mal geändert.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Du suchst vermutlich das Modul ``glob``. Übrigens ist deine ``for`` Schleife ziemlich sinnlos, wenn sie sowieso nur über einen Wert iteriert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
scheint genau das zu sein was ich suche, nachdem ich aber mal ein wenig damit experimentiert habe zeigt er mir immer den ganzen pfad an (also C:\Quellverzeichnisse\beispiel), ich will aber das er mir nur "beispiel.tar" als namen angibt (der ganze pfad als name wäre schon etwas kurios und verwirrend )
weiteres problem ist: wie komme ich an die Namen wieder ran... heisst was muss ich zum beispiel bei 'print' in die klammer schreiben damit mir die dateinamen angezeigt werden?
mein gedanke war
der hat jedoch so gar nicht funktioniert.. und aus den erkläreungen auf der Python homepage (http://docs.python.org/3.0/library/glob ... odule-glob) kann ich es leider nicht heraussehen (zu schlechte englisch-kenntnisse vermutlich )
weiteres problem ist: wie komme ich an die Namen wieder ran... heisst was muss ich zum beispiel bei 'print' in die klammer schreiben damit mir die dateinamen angezeigt werden?
mein gedanke war
Code: Alles auswählen
import glob
glob.glob('C:\\Quellverzeichnisse\\*')
print(glob)
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Naja, es hilft oftmals das zu ``print``en, was man auch sehen will. Dein ``print`` zeigt dein ``glob`` Modul - was du warscheinlich nicht sehen willst, statt dem Ergebnis von ``glob.glob``.
Code: Alles auswählen
import glob, os.path
print([os.path.basename(item) for item in glob.glob('lib/*') if os.path.isdir(item)])
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
oh stimmt, wenn ich jedonch 'print (glob.glob)' eingebe hat er das
gleiche problem und zeigt mir noch immer nichts an.
und falls eine hilfe o.ä. in deinem code steckt kann ich damit leider nichts anfangen , habe wie gesagt nur die nötigsten grundsätze und alles was ich für dieses projekt brauche, beigebracht.
gleiche problem und zeigt mir noch immer nichts an.
und falls eine hilfe o.ä. in deinem code steckt kann ich damit leider nichts anfangen , habe wie gesagt nur die nötigsten grundsätze und alles was ich für dieses projekt brauche, beigebracht.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Nichts stimmt so nicht, er zeigt sowas wie ``<function glob at 0x7f27690e6af0>`` an. Du solltest die Funktion auch *aufrufen* wenn du ihren Rückgabewert sehen willst.
Generell solltest du das Python-Tutorial mal durchmachen.
Generell solltest du das Python-Tutorial mal durchmachen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
richtig er zeigt etwas an, aber nichts was mir hilft
auf
folgt:
ich hatte vor erst dieses Projekt zuende zu bringen und mich dann aufmerksamer dem tutorial zu zuwenden.
auf
Code: Alles auswählen
import glob
glob.glob('C:\\Quellverzeichnisse\\*')
print (glob.glob)
und wegen dem tutorial: klar, habe ich es mir auch schon angesehen, da ich aber leider nicht sehr viel zeit für das Projekt habe, habe ich es hauptsächlich überflogen und immer das herausgepickt was mir als wichtig erschien. Ich weiss das jeder lehrer mich am liebsten erwürgen würe für diese weise von "lernen".Traceback (most recent call last):
File "C:\Python30\Projekte\glob.py", line 1, in <module>
import glob
File "C:\Python30\Projekte\glob.py", line 2, in <module>
glob.glob('C:\\Quellverzeichnisse\\*')
TypeError: 'module' object is not callable
ich hatte vor erst dieses Projekt zuende zu bringen und mich dann aufmerksamer dem tutorial zu zuwenden.
Dann ließ das Tutorial mal ganz - insbesondere den Abschnitt zu Funktionen.
Wenn Leonidas schreibt, dass man eine Funktion aufrufen soll, um an ihren Rückgabewert zu kommen, dann ist damit gemeint, dass dies
die Funktion ist und
die Adresse der Fuktion mitteilt. Das steht im Gegensatz zu
wobei Du den Wert der Funktion - nach Aufruf - an 'inhalt' bindest.
Und was Deinen Traceback angeht:
Wenn Du Deine Datei 'glob' nennst und 'import glob' schreibst, dann import Python Dein (!) 'glob'-Modul und nicht dasjenige, dass Du erwartest. Namespaces sind ganz toll, aber Du solltest vermeiden Deine Module so zu benennen, wie die Standardmodule. 'test.py' wäre ein schöner Name
Gruß,
Christian
Wenn Leonidas schreibt, dass man eine Funktion aufrufen soll, um an ihren Rückgabewert zu kommen, dann ist damit gemeint, dass dies
Code: Alles auswählen
glob.glob
Code: Alles auswählen
print(glob.glob)
Code: Alles auswählen
inhalt = glob.glob('*')
print(inhalt)
Und was Deinen Traceback angeht:
Wenn Du Deine Datei 'glob' nennst und 'import glob' schreibst, dann import Python Dein (!) 'glob'-Modul und nicht dasjenige, dass Du erwartest. Namespaces sind ganz toll, aber Du solltest vermeiden Deine Module so zu benennen, wie die Standardmodule. 'test.py' wäre ein schöner Name
Gruß,
Christian
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Jein. In CPython ist da die Speicheradresse, ja. Aber das ist kein definiertes Verhalten der Sprache, sondern implemetationsspezifisch. IronPython und Jython können da ganz andere Sachen darstellen. Die String-Repräsentation von Funktionen hat nunmal keinen spezielleren Nutzen als den von Programmierern gelesen zu werden.CM hat geschrieben:die Adresse der Fuktion mitteilt.Code: Alles auswählen
print(glob.glob)
Edit: Was ich damit sagen will: Man sollte sich im Quelltext nicht auf String-Repräsentationen von Funktionen verlassen. Das so als ganz genereller Tipp.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
DANKE DANKE Ich habs geschafft
mittlerweile habe ich das skript um die tar dateien zu erstellen:
und ich habe ein skript welches mir eine liste erstellt der (4) Ordner (ohne pfad) o.ä. die sich in dem ordner 'Quellverzeichnisse' (ohne pfad) befinden:
und das was ich haben wollte ist auch fertig =)
funktioniert einwandfrei, wer verschöbnerungs oder verbesserungsvorschläge hat, soll sie gerne frei äußern (auch wenn ich fertig und voll zufrieden bin )
Liebe Grüße Civili4an
mittlerweile habe ich das skript um die tar dateien zu erstellen:
Code: Alles auswählen
import tarfile
tar = tarfile.open("C:\\temp\\test.tar", "w")
tar.add ("C:\\Python30\\Projekte")
tar.close()
und ich habe ein skript welches mir eine liste erstellt der (4) Ordner (ohne pfad) o.ä. die sich in dem ordner 'Quellverzeichnisse' (ohne pfad) befinden:
Code: Alles auswählen
import glob
import os
os.chdir('C:\\Quellverzeichnisse')
inhalt = glob.glob('*')
Code: Alles auswählen
import tarfile
import os
import glob
a=("C:\\Quellverzeichnisse") #hier Ordner angeben dessen Inhalt gepackt werden soll
os.chdir(a)
inhalt = glob.glob('*')
for x in inhalt:
b=("C:\\Temp\\") #hier den Zielordner angeben
tar = tarfile.open(b + x + ".tar", "w")
tar.add(x)
tar.close()
Liebe Grüße Civili4an
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Die Klammern in Zeile 4 und 8 machen genau überhaupt nichts außer verwirren - du solltest sie weglassen. Außerdem sind ``a``, ``b`` und ``x`` ziemlich schlechte Namen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
EDIT:
Code: Alles auswählen
import tarfile
import os
import glob
ordner="C:\\Quellverzeichnisse" #hier Ordner angeben dessen Inhalt gepackt werden soll
os.chdir(ordner)
inhalt = glob.glob('*')
for datei in inhalt:
ziel="C:\\Temp\\" #hier den Zielordner angeben
tar = tarfile.open(ziel + datei + ".tar", "w")
tar.add(datei)
tar.close()
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Und weils grad so schön ist:
1. Wenn du mit Windows-Pfadnamen (oder RegExp, ..) hantierst nutze RawStrings:
"C:\\Quellverzeichnisse" -> r"C:\Quellverzeichnisse"
oder noch besser: gleich `os.path' - Mittel
2. PEP 8 -> http://www.python.org/dev/peps/pep-0008/ [wiki]PEP_8_(Übersetzung)[/wiki]
1. Wenn du mit Windows-Pfadnamen (oder RegExp, ..) hantierst nutze RawStrings:
"C:\\Quellverzeichnisse" -> r"C:\Quellverzeichnisse"
oder noch besser: gleich `os.path' - Mittel
2. PEP 8 -> http://www.python.org/dev/peps/pep-0008/ [wiki]PEP_8_(Übersetzung)[/wiki]
Trotz Smiley ist das vielleicht nicht jedem klar geworden: test.py ist ein schlechter Name, auch (aber nicht nur) weil es ein Standardmodul namens test gibt.CM hat geschrieben:Und was Deinen Traceback angeht:
Wenn Du Deine Datei 'glob' nennst und 'import glob' schreibst, dann import Python Dein (!) 'glob'-Modul und nicht dasjenige, dass Du erwartest. Namespaces sind ganz toll, aber Du solltest vermeiden Deine Module so zu benennen, wie die Standardmodule. 'test.py' wäre ein schöner Name
Danke nochmal für alle hilfen, läuft ja mittlerweile genau so wie ich es will, nur das es noch eine kleinen änderung bedürfte bei der ich nicht annähernd weiss wie ich sie umsetzten soll, und zwar:
ich würde das script gerne per console aufrufen und auch dorf festlegen welches der zu packende und welches der Zielordner ist, und zwar alles in einer zeile.
Eine Allgeneine erklärung wäre klasse da dies nicht das einziege script ist welches ich so aufrufen möchte.
MfG: Civili4n
P.S.: Die lösung muss nicht "Benutzerfreundlich" sein, heisst: es muss nirgendwo stehen: "Geben sie nun den Zielordner an... " usw.
Mein Ziel ist es ledeglich die console zu starten und dann einzutippen:
'C:\Python30\Projekte\tarerstellen.py C:\Quellverzeichnisse C:\Zielordner'
ich würde das script gerne per console aufrufen und auch dorf festlegen welches der zu packende und welches der Zielordner ist, und zwar alles in einer zeile.
Eine Allgeneine erklärung wäre klasse da dies nicht das einziege script ist welches ich so aufrufen möchte.
MfG: Civili4n
P.S.: Die lösung muss nicht "Benutzerfreundlich" sein, heisst: es muss nirgendwo stehen: "Geben sie nun den Zielordner an... " usw.
Mein Ziel ist es ledeglich die console zu starten und dann einzutippen:
'C:\Python30\Projekte\tarerstellen.py C:\Quellverzeichnisse C:\Zielordner'
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Dazu brauchst du nur sys.argv:
`sys.argv[0]` ist übrigens das Script.
Wenns komplexer wird solltest du dir `optparse` anschauen.
Code: Alles auswählen
import sys
source_dir = sys.argv[1]
target_dir = sys.argv[2]
Wenns komplexer wird solltest du dir `optparse` anschauen.
Danke! Klappt einwandfrei.
Ja komplexer wirds glücklicherweise noch nicht aber danke für den tipp, ich werde mir das mal genauer ansehen.
jetzt muss ich nur noch ne passende fehlermeldung einfügen aber ich hoffe das klappt mit 'try'... oder wird das nicht funktionieren bzw. gibts vllt ne bessere lösung?
MfG Civili4n
Ja komplexer wirds glücklicherweise noch nicht aber danke für den tipp, ich werde mir das mal genauer ansehen.
jetzt muss ich nur noch ne passende fehlermeldung einfügen aber ich hoffe das klappt mit 'try'... oder wird das nicht funktionieren bzw. gibts vllt ne bessere lösung?
MfG Civili4n