tar erstellen per Python 3.0

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.
Civili4n
User
Beiträge: 12
Registriert: Freitag 3. April 2009, 07:30

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 8) (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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo Civili4an, willkommen im Forum,

Was spricht denn dagegen tarfile herzunehmen, was bei Python in der Stdlib ist?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Civili4n
User
Beiträge: 12
Registriert: Freitag 3. April 2009, 07:30

hm, ja ehrlich gesagt nichts :P
mir wurde nur gesagt das ich 7-zip benutzen kann und bin dementsprechend davon ausgegangen das es nur so geht :P
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 :)
Civili4n
User
Beiträge: 12
Registriert: Freitag 3. April 2009, 07:30

Also grundsätzlich läuft es jetzt und siehst so aus:

Code: Alles auswählen

import tarfile

tar = tarfile.open("C:\\Temp\\Quellverzeichnisse.tar", "w")
for name in ["C:\\Quellverzeichnisse"]:
    tar.add(name)
tar.close()
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

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.
Leonidas
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
Civili4n
User
Beiträge: 12
Registriert: Freitag 3. April 2009, 07:30

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 :P )

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)
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 :oops: )
Leonidas
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
Civili4n
User
Beiträge: 12
Registriert: Freitag 3. April 2009, 07:30

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 :cry: , habe wie gesagt nur die nötigsten grundsätze und alles was ich für dieses projekt brauche, beigebracht.
Leonidas
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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Civili4n
User
Beiträge: 12
Registriert: Freitag 3. April 2009, 07:30

richtig er zeigt etwas an, aber nichts was mir hilft
auf

Code: Alles auswählen

import glob
glob.glob('C:\\Quellverzeichnisse\\*')
print (glob.glob)
folgt:
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
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".
ich hatte vor erst dieses Projekt zuende zu bringen und mich dann aufmerksamer dem tutorial zu zuwenden.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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

Code: Alles auswählen

glob.glob
die Funktion ist und

Code: Alles auswählen

print(glob.glob)
die Adresse der Fuktion mitteilt. Das steht im Gegensatz zu

Code: Alles auswählen

inhalt = glob.glob('*')
print(inhalt)
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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

CM hat geschrieben:

Code: Alles auswählen

print(glob.glob)
die Adresse der Fuktion mitteilt.
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.

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
Civili4n
User
Beiträge: 12
Registriert: Freitag 3. April 2009, 07:30

DANKE DANKE Ich habs geschafft
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('*')
und das was ich haben wollte ist auch fertig =)

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()
funktioniert einwandfrei, wer verschöbnerungs oder verbesserungsvorschläge hat, soll sie gerne frei äußern (auch wenn ich fertig und voll zufrieden bin :D )

Liebe Grüße Civili4an
Leonidas
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
Civili4n
User
Beiträge: 12
Registriert: Freitag 3. April 2009, 07:30

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()
Benutzeravatar
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]
bords0
User
Beiträge: 234
Registriert: Mittwoch 4. Juli 2007, 20:40

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 ;-)
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.
Civili4n
User
Beiträge: 12
Registriert: Freitag 3. April 2009, 07:30

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

Dazu brauchst du nur sys.argv:

Code: Alles auswählen

import sys
source_dir = sys.argv[1]
target_dir = sys.argv[2]
`sys.argv[0]` ist übrigens das Script.
Wenns komplexer wird solltest du dir `optparse` anschauen.
Civili4n
User
Beiträge: 12
Registriert: Freitag 3. April 2009, 07:30

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
Antworten