script das zope-ordnerstruktur erstellt

Django, Flask, Bottle, WSGI, CGI…
Antworten
harakiri
User
Beiträge: 4
Registriert: Donnerstag 26. April 2007, 15:11

Hallo zusammen,

ich bin erst seit kurzen mit python vertraut und habe folgendes Problem:

Ich möchte in zope ein python-script laufen lassen, das im aktuellen Ordner alle Ordner mit Unterordnern "einsammelt" und in einer Datei abspeichert - Format egal.
Also quasi den Ordnerbaum in eine Datei abspeichert.

Leider bekomme ich das bilsang nicht hin... habe auch schon vergebens nach einem ähnlichen Problem gesucht.

Ich bin für jede Hilfe dankbar, auch wenn sie nur einen Ansatz liefern sollte das Problem zu lösen.

Vielen Dank im Vorraus
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

harakiri hat geschrieben:Ordnerbaum in eine Datei abspeichert.
Hallo harakiri!

Willkommen im Python-Forum!

Im Zope findest du in jedem Ordner den Button "Import/Export". Der ist dafür da. Zuerst den Ordner mit einem Häckchen markieren und dann ein Klick auf "Import/Export"...

Ansonsten habe ich noch diesen Link für dich: http://gerold.bcom.at/zope_plone/zope_a ... sicherung/

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
harakiri
User
Beiträge: 4
Registriert: Donnerstag 26. April 2007, 15:11

Hallo Gerold,

erst einmal vielen Dank für die schnelle Anwort. Die Export Funktionalität fand ich sehr interessant, leider hilft sie mir nicht viel weiter, da ich mit den lokal abspeicherbaren Daten nichts anfangen kann.

Mit meinem Script bin ich aber schon etwas vorangekommen:
Ich kann das Ergebnis nun in einer Datei abspeichern und formatieren wie ich möchte. Das Problem was verleibt besteht darin, dass besagtes Ergebnis noch nicht ausreichend ist:

Ich kann mir über context.objectIds() alle Dateien im Ordner anzeigen lassen (in einem Array). Jedoch kann ich über .meta_type nicht auf den Type zugreifen. Um alle Unterordner mit einzuschließen muss ich ja wissen, was ein Ordner ist und diesen dann mit einbinden. Vermutlich liegt der Fehler am Rückgabewert von context.objectIds(), also dass die Elemente im Array vom falschen Typ sind und .meta_type darum nicht klappt.
Ich müsste also wissen, wie ich mir alle Elemente in einem Ordner samt Typ ausgeben lassen kann. :?:
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

harakiri hat geschrieben:context.objectIds()
Hi harakiri!

``context.objectIds()`` --> ``context.objectValues()``

http://www.zope.org/Documentation/Books ... B.stx#4-53
oder
http://www.plope.com/Books/2_7Edition/A ... B.stx#0-12

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
harakiri
User
Beiträge: 4
Registriert: Donnerstag 26. April 2007, 15:11

Sehr gut, ich bin schon ein gutes Stück weiter dank deiner hilfreichen Links.

Bei folgendem Code verstehe ich jedoch nicht, warum die Dateien in den Unterordnern nicht angezeigt werden... mach ich da irgendetwas falsch?

Code: Alles auswählen

import string

resultString = ""

def collectorFunction(varString, varFolder):
	for obj in varFolder.objectValues():
		if obj.meta_type == 'Folder':
			varString += string.upper(obj.getId()) + "\n"
			collectorFunction(varString, obj)
		else:
			varString += obj.getId() + "\n"
	return varString

return collectorFunction(resultString, context)
Ein gefundener Ordner wird richtig angezeigt, doch seine Inhalte nicht ausgegeben - woran liegt das?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

harakiri hat geschrieben:Ein gefundener Ordner wird richtig angezeigt, doch seine Inhalte nicht ausgegeben - woran liegt das?
Hi harakiri!

So vielleicht:

Code: Alles auswählen

            varString += string.upper(obj.getId()) + "\n"
            varString = collectorFunction(varString, obj)

mfg
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:

Ich habe es ausgetestet.

Code: Alles auswählen

def collectorFunction(varString, varFolder):
    for obj in varFolder.objectValues():
        if obj.meta_type == 'Folder':
            varString += string.upper(obj.getId()) + "\n"
            varString = collectorFunction(varString, obj)
        else:
            varString += obj.getId() + "\n"
    return varString

return collectorFunction("", context)
Aber da steckt noch sehr viel Arbeit darin, denn es gibt viele ordnerartige Objekte.

........

So werden alle orderartigen Objekte auch so behandelt:

Code: Alles auswählen

def collectorFunction(varString, varFolder):
    for obj in varFolder.objectValues():
        if obj.isPrincipiaFolderish:
            varString += string.upper(obj.getId()) + "\n"
            varString = collectorFunction(varString, obj)
        else:
            varString += obj.getId() + "\n"
    return varString

return collectorFunction("", context)
``isPrincipiaFolderish`` enthält die Information, ob es sich um ein ordnerartiges Objekt handelt.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
harakiri
User
Beiträge: 4
Registriert: Donnerstag 26. April 2007, 15:11

gerold hat geschrieben: So vielleicht:

Code: Alles auswählen

            varString += string.upper(obj.getId()) + "\n"
            varString = collectorFunction(varString, obj)
klappt super :-) aber natürlich mal wieder Fragen an dich:

(1) rein vom Verständnis her: Warum muss es varString = collectorFunction(...) sein und nicht varString += ... ?

(2) Noch eine weitere Verständnisfrage: warum funktioniert
varString += "<close node>\n"
aber nicht varString += "</node>\n" (-> liefert eine leere Seite im Browser bei print - wie kann man das umgehen?)

(3) .objectValues() scheint sehr teuer zu sein (es müssen über 2000 Ordner mit über 5000 Objekten durchsucht werden), gibt es vielleicht eine günstigere Variante?

nochmals tausend dank an dich Gerold!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi harakiri!
harakiri hat geschrieben:(1) rein vom Verständnis her: Warum muss es varString = collectorFunction(...) sein und nicht varString += ... ?
Weil du den vorhandenen String übergibtst und in der Funktion an diesen String alles angehängt wird. Mit ``return`` wird dir der komplette String (inkl. aller neuen Einträge) zurück gegeben und nicht nur die neuen Einträge.
harakiri hat geschrieben:(3) .objectValues() scheint sehr teuer zu sein
Das ist der Preis. -- Du brauchst die Eigenschaften des Objekts, also kannst du nicht einfach nur die ID zurückliefern lassen. Das wäre billiger, aber bringt dir nichts.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten